1인 개발 게임 (Unity)/UNITY

[UNITY] 오브젝트를 회전시키는 법 (+회전 속도를 부드럽게 줄이기)

Z46 2024. 8. 7. 10:04

 

안녕하세요, 인친님들! 오늘은 Unity에서 캐릭터를 회전시키는 다양한 방법에 대해 아주 자세히 알아보겠습니다.

 

 

Unity와 회전의 기본 개념

Unity에서 모든 게임 오브젝트는 'Transform' 컴포넌트를 가지고 있습니다. 이 Transform은 오브젝트의 위치(Position), 회전(Rotation), 크기(Scale)를 결정합니다. 회전을 다룰 때, 우리는 주로 이 Transform 컴포넌트를 이용하게 됩니다.

회전의 기본 단위는 '도(degree)'입니다. 360도가 한 바퀴를 의미하죠. Unity에서는 이를 왼손 좌표계로 표현합니다. 즉, 엄지손가락을 위로 했을 때 손가락이 구부러지는 방향이 양의 회전 방향입니다.

  • X축 회전: 좌우로 기울이기 (Roll)
  • Y축 회전: 좌우로 돌리기 (Yaw) - 가장 흔히 사용됨
  • Z축 회전: 앞뒤로 기울이기 (Pitch)

기본적인 캐릭터 회전

가장 간단한 방법부터 시작해봅시다. Transform.Rotate 함수를 사용하면 쉽게 캐릭터를 회전시킬 수 있습니다.

using UnityEngine;

public class CharacterRotator : MonoBehaviour
{
    public float rotationSpeed = 100f; // 회전 속도 (도/초)

    void Update()
    {
        // Y축을 중심으로 회전
        transform.Rotate(Vector3.up, rotationSpeed * Time.deltaTime);
    }
}

이 코드를 하나씩 뜯어볼까요?

  1. public float rotationSpeed = 100f;: 회전 속도를 설정합니다. 초당 100도를 의미합니다. public으로 선언되어 Unity 에디터에서 쉽게 수정할 수 있어요.
  2. transform.Rotate(Vector3.up, rotationSpeed * Time.deltaTime);:
    • Vector3.up은 Y축을 의미합니다. Y축을 중심으로 회전한다는 뜻이에요.
    • rotationSpeed * Time.deltaTime은 프레임에 상관없이 일정한 속도로 회전하게 해줍니다. Time.deltaTime은 이전 프레임부터 현재 프레임까지의 시간을 초 단위로 나타냅니다.

이 스크립트를 Unity에서 사용하려면:

  1. Unity 에디터에서 새 C# 스크립트를 만들고 이름을 'CharacterRotator'로 지정합니다.
  2. 스크립트를 더블클릭하여 열고, 내용을 위 코드로 바꿉니다.
  3. 회전시키고 싶은 캐릭터 오브젝트에 이 스크립트를 드래그앤드롭합니다.
  4. Play 버튼을 누르면 캐릭터가 회전하는 것을 볼 수 있습니다!

입력에 따른 회전

게임에서는 보통 플레이어의 입력에 따라 캐릭터가 회전해야 합니다. 키보드 입력으로 캐릭터를 회전시켜 볼까요?

using UnityEngine;

public class CharacterRotator : MonoBehaviour
{
    public float rotationSpeed = 100f; // 회전 속도 (도/초)

    void Update()
    {
        // 수평 입력 값을 가져옵니다 (-1 ~ 1 사이의 값)
        float horizontalInput = Input.GetAxis("Horizontal");

        // 입력 값에 따라 회전합니다
        transform.Rotate(Vector3.up, horizontalInput * rotationSpeed * Time.deltaTime);
    }
}

이 코드의 핵심은 Input.GetAxis("Horizontal")입니다.

  • 이 함수는 키보드의 A, D 키 또는 왼쪽, 오른쪽 화살표 키의 입력을 감지합니다.
  • A 키나 왼쪽 화살표를 누르면 -1, D 키나 오른쪽 화살표를 누르면 1, 아무것도 누르지 않으면 0을 반환합니다.
  • 이 값을 회전 속도와 곱해 회전 방향과 속도를 결정합니다.

이 스크립트를 사용하면, 키보드로 캐릭터를 좌우로 회전시킬 수 있습니다.

 

목표 방향으로 회전

게임에서 적이나 아이템을 향해 캐릭터가 자동으로 돌아보게 하고 싶을 때가 있죠. 이럴 때는 Quaternion.Slerp 함수를 사용합니다.

using UnityEngine;

public class CharacterRotator : MonoBehaviour
{
    public float rotationSpeed = 5f; // 회전 속도
    public Transform target; // 목표 오브젝트

    void Update()
    {
        if (target != null)
        {
            // 목표 방향 계산
            Vector3 direction = (target.position - transform.position).normalized;

            // 목표 방향을 바라보는 회전 계산
            Quaternion lookRotation = Quaternion.LookRotation(direction);

            // 현재 회전에서 목표 회전으로 부드럽게 보간
            transform.rotation = Quaternion.Slerp(transform.rotation, lookRotation, Time.deltaTime * rotationSpeed);
        }
    }
}

이 코드를 자세히 살펴볼까요?

  1. Vector3 direction = (target.position - transform.position).normalized;
    • 캐릭터에서 목표 지점으로의 방향을 계산합니다.
    • normalized는 이 방향의 길이를 1로 만들어 순수한 방향만 남깁니다.
  2. Quaternion lookRotation = Quaternion.LookRotation(direction);
    • 계산된 방향을 바라보는 회전을 생성합니다.
    • Quaternion은 3D 공간에서의 회전을 나타내는 특별한 방식입니다.
  3. transform.rotation = Quaternion.Slerp(transform.rotation, lookRotation, Time.deltaTime * rotationSpeed);
    • Slerp는 '구면 선형 보간'의 약자로, 두 회전 사이를 부드럽게 전환합니다.
    • 현재 회전에서 목표 회전으로 부드럽게 변화하게 해줍니다.

이 스크립트를 사용할 때는 Unity 에디터에서 'target' 필드에 목표 오브젝트를 드래그앤드롭으로 지정해주어야 합니다.

 

회전 속도 감속

때로는 캐릭터가 회전을 시작한 후 점차 느려지게 하고 싶을 수 있습니다. 이런 효과는 캐릭터의 움직임을 더 자연스럽게 만들어줍니다.
회전 속도를 줄이기 위해서는 감쇠 계수(예: 0.96)를 곱하면 됩니다. 이를 통해 부드럽게 감속할 수 있습니다!!

using UnityEngine;

public class CharacterRotator : MonoBehaviour
{
    public float initialRotationSpeed = 100f; // 초기 회전 속도 (도/초)
    public float decelerationFactor = 0.96f; // 감속 계수

    private float currentRotationSpeed;

    void Start()
    {
        currentRotationSpeed = initialRotationSpeed;
    }

    void Update()
    {
        // 현재 회전 속도로 캐릭터 회전
        transform.Rotate(Vector3.up, currentRotationSpeed * Time.deltaTime);

        // 회전 속도 감속
        currentRotationSpeed *= decelerationFactor;

        // 회전 속도가 너무 작아지면 정지
        if (currentRotationSpeed < 0.1f)
        {
            currentRotationSpeed = 0f;
        }
    }
}

이 코드의 핵심 부분을 설명해드릴게요:

  1. public float decelerationFactor = 0.96f;
    • 이 값은 매 프레임마다 현재 속도에 곱해집니다.
    • 1보다 작은 값이므로 속도가 점점 줄어들게 됩니다.
  2. currentRotationSpeed *= decelerationFactor;
    • 매 프레임마다 현재 회전 속도를 감소시킵니다.