강의, 책/[Unity] C#과 유니티로 만드는 MMORPG 게임 개발 시리즈 22

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..

Section 4. Collision - Collision, Trigger

OnCollision 함수의 호출 조건 1. 나 혹은 상대한테 RigidBody가 있어야 한다 (IsKinematic : Off) 2. 나한테 Collider가 있어야 한다 (IsTrigger : Off) 3. 상대한테 Collider가 있어야 한다 (IsTrigger : Off) OnTrigger 함수의 호출 조건 1. 둘 다 Collider가 있어야 한다 2. 적어도 둘 중 하나는 IsTrigger : On 3. 적어도 둘 중 하나는 RigidBody가 있어야 한다

Section 3. Prefab - Resource Manager

Resources 라는 폴더 내에 위치한 리소스들을 코드 상에서 불러와서 사용할 수 있다 따라서 아트, 사운드 등의 리소스들은 모두 Asset > Resources 폴더 내에 위치시켜두면 된다 prefab = Resources.Load("Prefabs/Tank"); 위와 같이 Resources > Prefabs > Tank 경로에 위치한 게임 오브젝트를 가져올 수 있다 public class ResourceManager { public T Load(string path) where T : Object { return Resources.Load(path); } public GameObject Instantiate(string path, Transform parent = null) { GameObject o..

Section 2. Transfrom - Input Manager

키 입력을 매번 Update() 문에서 처리하는 것이 아니라, Manager를 하나 만든 뒤, 해당 부분에서 키 입력 체크를 하고 이를 필요로 하는 다른 부분들에 호출시키는 방식으로 작업하면 부하를 줄일 수 있다 public class InputManager { public Action KeyAction = null; public void OnUpdate() { if (Input.anyKey == false) return; if (KeyAction != null) KeyAction.Invoke(); } } * MonoBehavior을 상속받지 않는 형태로 만들어주었고, 때문에 Update 함수를 사용할 수 없어, 외부 스크립트에서 불러올 수 있도록 public의 OnUpdate라는 이름의 함수를 만들어주..

Section 2. Transform - Rotate

GameObject의 절대적인 rotate 값을 변경해주기 위해서는 transform.eulerAngles = new Vector3(0.0f, 0.0f, 0.0f); 위와 같이 오일러앵글을 사용해줘야 한다 그런데 이 eulerAngles는 360도가 넘어갈 경우 오작동할 가능성이 있기 때문에, 값을 입력할 때 absolute value로만 입력해주고, 덧셈 뺄셈 같은 연산을 할 수는 없다 따라서 절대 회전값 말고 delta 값을 +- 해서 사용하려면 transform.Rotate() 함수를 사용해야 한다 transform.Rotate(new Vector3(0.0f, Time.deltaTime * 100.0f, 0.0f)); 이렇게 인자로 회전시킬 값을 넣어주면 y축 기준으로 Time.deltaTime *..

Section 2. Transform - Vector3

Vector의 두 가지 쓰임새 1. 위치 벡터 2. 방향 벡터 void Start() { Vector3 to = new Vector3(10.0f, 0.0f, 0.0f); Vector3 from = new Vector3(5.0f, 0.0f, 0.0f); Vector3 dir = to - from; // (5.0f, 0.0f, 0.0f); } 위와 같이 목적지의 위치 벡터에서 출발지의 위치 벡터를 빼주면 출발지 -> 목적지로 향하는 방향 벡터가 나오게 된다 방향 벡터로 구할 수 있는 값 1. 거리(크기) 2. 실제 방향 magnitude 함수를 사용하면 거리(크기)를 구할 수 있고, normalized 함수를 사용하면 방향(크기 1짜리)를 구할 수 있다