전체 글 134

Section 8. Scene - Scene Manager

Assets > Scripts > Utils > Define.cs에 씬과 관련된 열거체를 추가로 정의해준다 public enum Scene { Unknown, Login, Lobby, Game } 그리고 씬을 관리하기 위한 새로운 스크립트 Assets > Scripts > Scenes > BaseScene.cs를 생성해준다 public abstract class BaseScene : MonoBehaviour { public Define.Scene SceneType { get; protected set; } = Define.Scene.Unknown; void Awake() { Init() } protected virtual void Init() { Object obj = GameObject.FindObje..

Section 7. UI - 코드 정리

1. getOrAddComponent 함수를 extension method로 변경해준다 Assets > Scripts > Utils > Extension.cs public static class Extension { public static T GetOrAddComponent(this GameObject go) where T : UnityEngine.Component { return Util.GetOrAddComponent(go); } public static void AddUIEvent(this GameObject go, Action action, Define.UIEvent type = Define.UIEvent.Click) { UI_Base.AddUIEvent(go, action, type); } }..

Section 7. UI - 인벤토리 실습

인벤토리 패널 산하에 들어가는 Inven_Item 스크립트는 UI_Popup도, UI_Panel도 아니기 때문에 UI_Base를 상속받게 되는데, 그럼 팝업과 씬에서 만들어두었던 Init 함수를 사용하지 못하기 때문에 그 부분을 수정해준다 public abstract class UI_Base : MonoBehaviour { public abstract void Init(); } UI_Base 스크립트에 이렇게 추가해준다 이때 virtual로 선언한 것과 달리, abstract로 선언한 경우, 자식 클래스에서 반드시 재선언을 해주어야 사용할 수가 있다 그리고 Ui_Popup.cs, UI_Scene.cs에서 기존에 virtual Init으로 선언했던 함수를 override Init으로 변경해주면 된다

Section 7. UI - UI Manager

UI를 팝업 UI와 고정형 UI로 구분하여 생각하기 UI > Popup > UI_Popup.cs, UI > Scene > UI_Scene.cs 스크립트를 각각 만들어주고, 이 베이스 스크립트들은 MonoBehaviour 대신 UI_Base를 상속받는다 - 팝업과 씬 스크립트를 새로 만들 때 위 베이스 스크립트를 상속 받아서 사용 - Popup, Scene 폴더 내 스크립트들은 이제 UI_Base 대신 UI_Popup, UI_Scene 을 상속받으면 됨 UIManager _ui = new UIManager(); public static UIManager UI { get { return Instance._ui; } } UIManager 스크립트를 만들어준 뒤, Manager.cs에 연결시켜준다 public ..

Section 7. UI - UI 자동화(이벤트)

Assets > Scripts > UI > UI_EventHandler.cs (EventSystem이 클릭을 감지하여 이벤트를 뿌려주면 UI에서 캐치해서 콜백 함수를 날려주는 역할, 드래그 이벤트를 감지할 오브젝트에 부착해주면 된다) public class UI_EventHandler : MonoBehaviour, IPointerClickHandler, IDragHandler { public Action OnClickHandler = null; public Action OnDragHandler = null; public void OnPointerClick(PointerEventData eventData) { if (OnClickHandler != null) OnClickHandler.Invoke(even..

Section 7. UI - UI 자동화(바인딩)

public class UI_Button : MonoBehaviour { Dictionary _objects = new Dictionary(); enum Buttons { PointButton } enum Texts { PointText, ScoreText } private void Start() { Bind(typeof(Buttons)); Bind(typeof(Texts)); } void Bind(Type type) where T : UnityEngine.Object { string[] names = Enum.GetNames(type); UnityEngine.Object[] objects = new UnityEngine.Object[names.Length]; _objects.Add(typeof(T), ..

Section 6. Animation - State 패턴

여러가지 상태들을 bool 변수로 두고 관리하다 보면 스파게티 코드가 되어버려 점점 요소를 추가하거나 관리하기가 힘들어진다 따라서 이들을 state 패턴으로 관리하면 편하다 PlayerController 스크립트에서 다음과 같은 열거형을 만들어준다 public enum PlayerState { Die, Moving, Idle, } PlayerState _state = PlayerState.Idle; 그리고 Update함수에서 switch 문을 활용하여 분기를 만들어주고, 각 함수에 기존 동작들을 넣어준다 void Update() { switch (_state) { case PlayerState.Die: UpdateDie(); break; case PlayerState.Moving: UpdateMoving..

Section 6. Animation - Animation Blending

애니메이션의 상태 변화를 조금 더 자연스럽게 할 수 있도록 도와주는 기능 Animator 창에서 우클릭 해서 Create State > From new Blend Tree 를 클릭해주면 블랜드 트리가 생긴다 그리고 블랜드 트리를 타고 들어가서 Blend tree에 우클릭 > Add Motion 혹은 Inspector 창에서 + > add motion field를 눌러서 모션을 추가해준다 float 형식의 새 파라미터를 추가해주고, Inspector 창에서 Blend로 되어있던 파라미터를 새로 추가한 파라미터로 변경해준다 위에 그래프 부분을 클릭하면 아래에서 Threshold 수치를 변경할 수 있는데, 각각 0과 1로 맞춰준다 결국 wait_run_ratio(그래프에서 빨간 선을 움직이며 확인 가능) 수치..

Section 5. Camera

다양한 카메라 모드를 구현하기 위해 새로운 스크립트를 정의한다 파일 경로: Assets > Scripts > Utils > Define.cs public class Define { public enum CameraMode { QuarterView, } } 위와 같이 카메라모드를 정의해 준 다음, Assets > Scripts > Controllers > CameraController.cs(main camera 오브젝트에 부착)에서 public class CameraController : MonoBehaviour { Define.CameraMode _mode = Define.CameraMode.QuarterView; Vector3 _delta = new Vector3(0.0f, 6.0f, -5.0f); G..

Section 4. Collision - Raycasting, LayerMask

Raycasting: 말 그대로 광선을 쏜다, 쏜 광선이 어딘가에 충돌하면 충돌한 물체에 대한 정보를 알 수 있음 Debug.DrawRay를 활용해 그려진 Ray의 경로를 확인할 수 있다 Debug.DrawRay(transform.position + Vector3.up, Vector3.forward * 10. Color.red); 이런 식으로 코드 작성이 가능하다 첫번째 인자: 출발점, 두번째 인자: 방향 및 길이, 세번째 인자: 색 전달하는 인자들의 구성은 여러 버전이 있으니 참고해서 작성하면 된다 Vector3 look = transform.TransformDirection(Vector3.forward); RaycastHit hit; if (Physics.Raycast(transform.positio..