- 3인칭 게임을 개발하면서 캐릭터 움직임을 어떻게 구현하면 되는지를 정리한 내용입니다.
- 검은 사막과 같은 RPG 게임의 캐릭터 움직임 구현에 대한 내용입니다.
- 캐릭터 움직임 구현
- direction의 각도를 구하여 플레이어 캐릭터 회전
- 카메라 회전에 따른 플레이어 캐릭터 회전
- 회전 각에 맞추어 캐릭터가 이동해야 하는 방향 결정
- Chracter Controller 의 Velocity를 이용해 애니메이션 구현
- 키 입력에 따른 direction 구하기
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
// 입력에 따른 방향
Vector3 direction = new Vector3(horizontal, 0, vertical).normalized;
- direction을 Character Controller 내 Move 또는 SimpleMove 메소드에 적용
( Move는 Gravity가 없기에 추가 )
// 중력 적용
direction.y -= gravity * Time.deltaTime;
// Character Controller 에서 제공하는 Move 메소드를 이용해 driection 방향으로 이동.
controller.Move(direction * speed * Time.deltaTime);
-
Mathf.Atan2(float y,float x)를 이용하여 각도 구하기 ⭐⭐
-
캐릭터는 Z축을 바라보고 있기 때문에 아래 그림의 세타 값을 구해야 한다.
-
tan(Θ) = x/z 이므로, Θ = atan(x/z)
-
// 캐릭터 회전을 위해 각도를 구한다. ( z축이 ( 우리가 알고 있는 x,y 좌표에서 ) x가 되기 때문에 Atan2의 y 파라미터에 x가 들어감 )
float angle = Mathf.Atan2(direction.x, direction.z) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(0f, angle, 0f);
- 2 번에서 구한 angle에 카메라 rotation의 y 값을 더해준다.
float angle += cam.eulerAngles.y;
-
Vector3.Forward(0,0,1) 에 구해진 각도(angle)을 곱해 angle만큼 회전된 Vector값을 얻는다.
- Vector3.Forward(0,0,1)인 이유
-
Vector3.Forward 는 z축을 방향으로 하는 크기가 1인 정규화된 방향 벡터
-
크기가 1인 벡터는 단순히 방향만 나타낸다.
-
캐릭터는 Z축이 전방이다.
-
거기에 angle를 곱하면 angle만큼 회전한 새로운 전방을 얻을 수 있기 때문이다.
-
( ⭐⭐정규화된 벡터는 방향을 나타낸다⭐⭐ )
- Vector3.Forward(0,0,1)인 이유
-
구해진 Vector값이 Direction이 된다.
// 회전 각만큼 방향도 돌려주기 위해 Vector3.froward 에 각도를 곱해준다. ( 캐릭터 기준 전방이 z이기 때문에 Vector3.Forward를 곱함 )
direction = Quaternion.Euler(0f, angle, 0f) * Vector3.forward;
- Character Controller 내 Move 또는 SimpleMove 메소드를 이용해 구현 ( 위 1번에서 설명한 내용과 동일 )
// Character Controller 에서 제공하는 Move 메소드를 이용해 driection 방향으로 이동.
controller.Move(direction * speed * Time.deltaTime);