부드럽게 회전하기
Coddy Unity 여정의 물리와 게임플레이 섹션에 포함된 레슨. 71개 중 45번째.
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)는 Vector3.Lerp가 점에 적용되는 것처럼 a에서 b까지의 경로 중 t만큼 회전한 결과입니다. Update()에서 Slerp(transform.rotation, goal, 5f * Time.deltaTime)로 작성하면 매 프레임 남은 각도의 일부만큼 회전합니다. 처음에는 빠르게 회전하고 목표에 가까워질수록 점점 느려져, 정해진 속도로 회전하지 않으며 목표에 완전히 도달하지도 않습니다. 이런 부드러운 감속은 카메라나 머리를 돌릴 때 적합합니다. 대포가 초당 60도 회전하는 것처럼 회전 속도가 게임 규칙인 경우에는 RotateTowards를 사용하세요.
챌린지
중급각 화살표가 가리키는 방향으로 올빼미가 부드럽게 회전하도록 하세요.
Quaternion goal;을 추가하고Start()에서transform.rotation으로 설정하세요.- 각 화살표의
Input.GetKeyDown에서goal을 설정하세요. 예를 들어goal = Quaternion.LookRotation(Vector3.right);와 같이 설정합니다. 위쪽은 +z, 오른쪽은 +x, 아래쪽은 -z, 왼쪽은 -x입니다. - 매 프레임
transform.rotation = Quaternion.RotateTowards(transform.rotation, goal, turnSpeed * Time.deltaTime);을 설정하세요.
‘플레이’를 누르고 화살표를 탭하세요. 그런 다음 ‘확인’을 누르세요.
직접 해보기
using UnityEngine;
public class Owl : MonoBehaviour
{
public float turnSpeed = 180f;
void Update()
{
// 위, 오른쪽, 아래, 왼쪽: turnSpeed의 초당 회전 각도에 따라 각각 +z, +x, -z, -x 방향을 향하도록 회전합니다.
}
}
물리와 게임플레이의 모든 레슨
직접 연습해 보세요: Unity 플레이그라운드