분류 전체보기 147

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짜리)를 구할 수 있다

Section 2. Transform - Position(WASD로 플레이어 움직이기)

void Update() { if (Input.GetKey(KeyCode.W)) transform.position += Vector3.forward * Time.deltaTime * _speed; if (Input.GetKey(KeyCode.S)) transform.position += Vector3.back * Time.deltaTime * _speed; if (Input.GetKey(KeyCode.A)) transform.position += Vector3.left * Time.deltaTime * _speed; if (Input.GetKey(KeyCode.D)) transform.position += Vector3.right * Time.deltaTime * _speed; } 요약: WASD 키로 ..