게임 개발

Unity 회전이 튈 때: 오일러 각, Slerp, RotateTowards 구분하기

350도에서 10도로 회전하는 예로 각도 경계를 설명합니다. 일정 각속도와 일정 시간 보간의 차이, LookRotation의 입력 조건을 다룹니다.

CodingJoa 수정 2026.09.22 3분 정도 걸립니다
Unity 회전이 튈 때: 오일러 각, Slerp, RotateTowards 구분하기

카메라가 갑자기 반 바퀴를 돌아갔다고 해서 모두 짐벌락은 아닙니다. 350도에서 10도로 가려는데 각도를 단순 보간해 180도를 지나간 경우도 있고, 로컬 회전과 월드 회전을 섞은 경우도 있습니다. 증상을 먼저 나누면 쿼터니언을 어디에 써야 할지 분명해집니다.

Unity 6는 Transform의 회전을 내부적으로 쿼터니언으로 저장하고 Inspector에는 오일러 각으로 보여줍니다. Inspector에 숫자 세 개가 보인다는 이유로 내부 표현도 숫자 세 개라고 생각하면 혼동이 생깁니다.

350도에서 10도까지의 두 경로

숫자 자체를 선형 보간하면 중간값은 180도입니다. 하지만 원 위에서는 350 → 360(0) → 10으로 20도만 이동하는 경로가 있습니다. Y축 하나만 다루는 회전이라면 Mathf.LerpAngle로 경계를 처리할 수 있습니다.

여러 축을 동시에 다룰 때는 회전 전체를 Quaternion으로 보간합니다. 짐벌락은 오일러 표현에서 회전축이 겹쳐 자유도를 잃는 현상이며, 3D 세계가 실제로 4D이기 때문에 발생하는 문제가 아닙니다. 동차 좌표의 w와 쿼터니언의 w도 서로 다른 역할입니다.

일정 각속도로 목표를 바라보기

TurnTowardTarget.cs는 Y축 방향만 도는 예제입니다. 캐릭터 모델의 정면이 +Z라는 전제입니다.

using UnityEngine;

public sealed class TurnTowardTarget : MonoBehaviour
{
    [SerializeField] private Transform target;
    [SerializeField, Min(0f)] private float degreesPerSecond = 90f;

    private void Update()
    {
        if (target == null)
            return;

        Vector3 direction = target.position - transform.position;
        direction.y = 0f;
        if (direction.sqrMagnitude < 0.000001f)
            return;

        Quaternion desired = Quaternion.LookRotation(direction, Vector3.up);
        transform.rotation = Quaternion.RotateTowards(
            transform.rotation, desired,
            Mathf.Max(0f, degreesPerSecond) * Time.deltaTime);
    }
}

목표가 고정되어 있고 90도 떨어져 있다면, 초당 90도 설정에서 약 1초 후 도착해야 합니다. 같은 위치의 목표를 넣어도 LookRotation에 영벡터를 넘기지 않습니다. 3D 비행체에서는 방향이 up과 평행한 경우도 별도로 설계해야 합니다.

Slerp의 세 번째 인자는 속도가 아니다

Quaternion.Slerp(start, end, progress)의 progress는 0~1 진행률입니다. 2초 동안 회전하려면 시작 회전을 한 번 저장하고 경과 시간/2를 넣습니다.

매 프레임 Slerp(current, target, 0.1f)를 호출하면 매번 남은 회전의 일부만 이동합니다. 시작점이 계속 바뀌어서 처음에는 빠르고 나중에는 느려지며, 프레임률에도 영향을 받습니다. 의도한 것이 추종 감쇠라면 쓸 수 있지만 “2초 뒤 도착” 구현과는 다릅니다.

원하는 동작출발점
문이 정해진 한 축으로 열림각도 값을 따로 관리하고 LerpAngle
초당 최대 90도까지 추적RotateTowards
고정된 시작·끝 사이를 2초간 회전저장한 시작 회전 + Slerp 진행률
목표를 향해 점점 느리게 접근시간 간격을 고려한 감쇠 설계

마지막으로 Quaternion의 x/y/z를 도 단위 각도로 수정하지 마세요. 네 성분은 회전축과 각도를 결합한 표현입니다. Quaternion.Euler, AngleAxis, LookRotation처럼 의도가 드러나는 API로 생성하는 편이 좋습니다.

참고 문서

이 글 공유하기 X Facebook 네이버

이 글은 기술 설명과 참고 자료, 글쓴이의 판단을 담고 있습니다. 예제와 실제 사용 사례의 적용 조건은 본문을 참고해주세요. 도구의 버전·가격·동작은 시간이 지나면 달라질 수 있으니, 따라 하실 때는 공식 문서를 함께 확인해주세요. 자세한 내용은 이용약관에 정리해두었습니다.