Home [Unity] 3인칭 캐릭터 움직임 구현 방법 정리
Post
Cancel

[Unity] 3인칭 캐릭터 움직임 구현 방법 정리

  • 3인칭 게임을 개발하면서 캐릭터 움직임을 어떻게 구현하면 되는지를 정리한 내용입니다.
  • 검은 사막과 같은 RPG 게임의 캐릭터 움직임 구현에 대한 내용입니다.

1. 캐릭터 움직임 구현

  • 키 입력에 따른 direction 구하기
1
2
3
4
5
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가 없기에 추가 )
1
2
3
4
5
// 중력 적용
direction.y -= gravity * Time.deltaTime;

// Character Controller 에서 제공하는 Move 메소드를 이용해 driection 방향으로 이동.
controller.Move(direction * speed * Time.deltaTime);

2. direction의 각도를 구하여 플레이어 캐릭터 회전

  • Mathf.Atan2(float y,float x)를 이용하여 각도 구하기 ⭐⭐
    • 캐릭터는 Z축을 바라보고 있기 때문에 아래 그림의 세타 값을 구해야 한다.
    • tan(Θ) = x/z 이므로, Θ = atan(x/z)

unity_image_01

1
2
3
// 캐릭터 회전을 위해 각도를 구한다. ( z축이 ( 우리가 알고 있는 x,y 좌표에서 ) x가 되기 때문에 Atan2의 y 파라미터에 x가 들어감 )
float angle = Mathf.Atan2(direction.x, direction.z) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(0f, angle, 0f);

3. 카메라 회전에 따른 플레이어 캐릭터 회전

카메라는 Unity Cinemachine 을 사용하였습니다.

  • 2 번에서 구한 angle에 카메라 rotation의 y 값을 더해준다.
1
float angle += cam.eulerAngles.y;

4. 회전 각에 맞추어 캐릭터가 이동해야 하는 방향 결정

  • Vector3.Forward(0,0,1) 에 구해진 각도(angle)을 곱해 angle만큼 회전된 Vector값을 얻는다.

    • Vector3.Forward(0,0,1)인 이유
      • Vector3.Forward 는 z축을 방향으로 하는 크기가 1인 정규화된 방향 벡터
      • 크기가 1인 벡터는 단순히 방향만 나타낸다.
      • 캐릭터는 Z축이 전방이다.
      • 거기에 angle를 곱하면 angle만큼 회전한 새로운 전방을 얻을 수 있기 때문이다.

    ( ⭐⭐정규화된 벡터는 방향을 나타낸다⭐⭐ )

  • 구해진 Vector값이 Direction이 된다.

1
2
// 회전 각만큼 방향도 돌려주기 위해 Vector3.froward 에 각도를 곱해준다. ( 캐릭터 기준 전방이 z이기 때문에 Vector3.Forward를 곱함 )
direction = Quaternion.Euler(0f, angle, 0f) * Vector3.forward;
  • Character Controller 내 Move 또는 SimpleMove 메소드를 이용해 구현 ( 위 1번에서 설명한 내용과 동일 )
1
2
// Character Controller 에서 제공하는 Move 메소드를 이용해 driection 방향으로 이동.
controller.Move(direction * speed * Time.deltaTime);

5. Chracter Controller 의 Velocity를 이용해 애니메이션 구현

  • Blend Tree를 이용
    • Blend Type : 1D
    • Parameter : Character Controller 의 Velocity 값
    • Ex) unity_image_02

결과

This post is licensed under CC BY 4.0 by the author.