부드럽게 회전하기
Coddy Unity 여정의 물리와 게임플레이 섹션에 포함된 레슨. 63개 중 43번째.
transform.rotation을 새 회전값으로 바로 설정하면 객체는 한 프레임 만에 회전합니다. Quaternion.RotateTowards(current, goal, maxDegrees)는 current를 goal 방향으로 최대 maxDegrees만큼 회전한 값을 반환하며, 목표를 지나치지 않습니다. 이동 단계로 turnSpeed * Time.deltaTime을 사용하면 객체는 일정한 속도로 회전하고, 위치에 대해 MoveTowards가 그러듯 목표에 정확히 도달해 멈춥니다. 이 해바라기는 초당 30도씩 태양을 따라갑니다.
public Transform sun;
public float turnSpeed = 30f;
void Update()
{
Quaternion goal = Quaternion.LookRotation(sun.position - transform.position);
transform.rotation = Quaternion.RotateTowards(transform.rotation, goal, turnSpeed * Time.deltaTime);
}태양이 90도 떨어져 있다면 해바라기는 3초가 걸리며, 매초 30도씩 회전합니다. 해바라기는 더 짧은 방향으로 회전하고, 목표는 매 프레임 다시 계산되므로 움직이는 태양도 따라갑니다.
Quaternion.Slerp(a, b, t)는 a에서 b까지 가는 길의 t만큼 지점에 해당하는 회전입니다. 점에 대해 Vector3.Lerp가 하는 것과 같습니다. Update()에서 Slerp(transform.rotation, goal, 5f * Time.deltaTime)로 작성하면 매 프레임 남은 각도의 일부만큼 회전합니다. 처음에는 빠르게 회전하고, 목표에 가까워질수록 점점 느려지며, 일정한 속도로 회전하지 않고 목표에 완전히 도달하지도 않습니다. 이런 부드러운 감속은 카메라나 고개를 돌리는 동작에 적합합니다. 대포가 초당 60도 회전하는 것처럼 회전 속도가 게임의 규칙일 때는 RotateTowards를 사용하세요.
챌린지
중급올빼미는 가리키는 방향을 바라보도록 회전합니다. 각 화살표 키는 올빼미가 향할 새 방향을 지정합니다. 위쪽은 +z, 오른쪽은 +x, 아래쪽은 -z, 왼쪽은 -x입니다. 키를 누르면 올빼미는 초당 turnSpeed(180)도씩 일정한 속도로 해당 방향을 향해 회전하기 시작하며, 키에서 손을 뗀 뒤에도 회전을 계속해 새 방향에 정확히 멈춥니다.
Play를 누르고, 화살표 키를 누른 다음 Check를 누르세요.
직접 해보기
using UnityEngine;
public class Owl : MonoBehaviour
{
public float turnSpeed = 180f;
void Update()
{
// 위, 오른쪽, 아래, 왼쪽: 초당 turnSpeed도씩 회전하여 각각 +z, +x, -z, -x 방향을 바라보게 합니다.
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.