Skip to content

Latest commit

 

History

History
87 lines (70 loc) · 4.06 KB

3인칭 캐릭터 움직임에 대한 정리.md

File metadata and controls

87 lines (70 loc) · 4.06 KB

3인칭 캐릭터 움직임 구현 방법에 대한 정리

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

3인칭 캐릭터 움직임 순서

  1. 캐릭터 움직임 구현
  2. direction의 각도를 구하여 플레이어 캐릭터 회전
  3. 카메라 회전에 따른 플레이어 캐릭터 회전
  4. 회전 각에 맞추어 캐릭터가 이동해야 하는 방향 결정
  5. Chracter Controller 의 Velocity를 이용해 애니메이션 구현

1. 캐릭터 움직임 구현

  • 키 입력에 따른 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);

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

  • Mathf.Atan2(float y,float x)를 이용하여 각도 구하기 ⭐⭐

    • 캐릭터는 Z축을 바라보고 있기 때문에 아래 그림의 세타 값을 구해야 한다.

    • tan(Θ) = x/z 이므로, Θ = atan(x/z)

image

// 캐릭터 회전을 위해 각도를 구한다. ( 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. 카메라 회전에 따른 플레이어 캐릭터 회전

  • 2 번에서 구한 angle에 카메라 rotation의 y 값을 더해준다.
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이 된다.

// 회전 각만큼 방향도 돌려주기 위해 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);

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

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

결과

구현 결과