최대 1 분 소요

Intro

  • 이번포스팅에서는 캐릭터가 움직이는 방향에따라 회전할 수 있도록 만들어보겠습니다.

  • 회전시키는 방법에는 여러가지가 있습니다.
    1. 직각으로 회전 : 좌우 회전이 90도로 휙휙 바뀝니다.
    2. 자연스러운 회전 : 좌우 회전이 자연스럽게 바뀝니다.
  • 저는 자연스럽게 회전할 수 있도록 만들어보겠습니다.

캐릭터 회전

  • Unity에서 오브젝트를 회전시키는 방법은 여러가지가 있습니다. 그 중 저는 Quaternion(쿼터니언)을 사용했습니다.
    • Quaternion은 3차원 회전을 표현하는데 사용되는 4차원 벡터로,
    • Quaternion의 메서드 LookRotation 메서드를 사용했습니다.
  • Quaternion.LookRotation() 메서드는 벡터를 매개변수로 넣어주면 오브젝트가 지정된 방향을 가리키는 쿼터니언을 생성합니다.
    • 따라서 Quaternion 형태의 변수(newRotation)를 하나 만들어, moveVec(방향벡터)를 가리키는 쿼터니언을 저장하고
    • rigidBody의 rotation을 이용하여 캐릭터를 회전시킵니다.
    • 이때 Slerp 메서드를 사용하여 부드러운 회전을 만들어줍니다.

Lerp VS SLerp

Lerp와 Slerp는 Quaternion의 메서드로, “선형보간법” 이라는것을 통해 오브젝트를 회전시키는 방법입니다.

public static Quaternion Lerp(Quaternion a, Quaternion b, float t);
public static Quaternion Slerp(Quaternion a, Quaternion b, float t);
  • Lerp 와 Slerp의 차이점은 선형보간법의 방식 차이인데, 요컨대 Slerp가 좀 더 부드럽게 회전한다는것이다.

코드

// 플레이어 회전로직
    void Turn()
    {
        // 캐릭터가 정지했을 때
        if (moveVec == Vector3.zero)
            return;

        Quaternion newRotation = Quaternion.LookRotation(moveVec);
        rigid.rotation = Quaternion.Slerp(rigid.rotation, newRotation, playerInfo.rotateSpeed * Time.deltaTime);
    }
  • 회전속도를 담는 rateSpeed 라는 변수를 추가하여

  • rigid.rotation에서 newRotation까지 playerInfo.rotateSpeed * Time.deltaTime 만큼 보간하여 새로운 회전값을 생성

  • 따라서 Turn() 함수를 Update() 함수에서 호출시켜 rigid의 rotation을 회전시킵니다.

image

댓글남기기