이번 영상은 Unity 2022에서 오브젝트가 다른 오브젝트를 향하도록 만드는 Look At 스크립트에 대한 두 번째 튜토리얼입니다.


이 튜토리얼의 동영상 버전은 현재 이 언어로 제공되지 않습니다.


영상 자막 텍스트

안녕하세요 여러분!

이번 영상은 Unity 2022에서 오브젝트가 다른 오브젝트를 향하도록 만드는 Look At 스크립트에 대한 두 번째 튜토리얼입니다.

첫 번째 파트에서는 문제를 분석하고 오브젝트가 즉시 회전하는 방식의 해결책을 구현했습니다. 이번 튜토리얼에서는 Quaternions와 Slerp를 사용하여 더 느리고 점진적인 회전을 구현해 보겠습니다.

이 튜토리얼에서는 Time.deltaTime과 Quaternion.Slerp 메서드와 같은 개념을 이미 알고 있다고 가정합니다. 이 내용들은 이전 튜토리얼에서 다루었습니다. 만약 이러한 주제에 익숙하지 않다면, 먼저 해당 튜토리얼을 확인하는 것을 권장합니다.

이전 튜토리얼에서는 카메라의 글로벌 축과 로컬 축을 살펴보았습니다. 이는 카메라의 방향을 나타내는 축을 식별하고, 회전을 수행할 축을 결정하기 위함이었습니다.

그 다음, 문제를 2차원 평면으로 단순화하고 Surveillance Camera의 3D 모델을 회전시킬 각도를 계산했습니다.

스크립트에서 이 각도는 deltaAngle이라고 하며, 단위는 도입니다.

Slerp를 사용하려면 세 가지가 필요합니다.

초기 방향을 나타내는 quaternion

도달해야 할 목표 방향을 나타내는 quaternion

게임 실행 중 각 프레임에서 초기 방향에서 최종 방향으로의 전환이 0에서 1 사이의 어느 지점에 있는지를 나타내는 값

첫 번째는 가장 간단합니다. transform의 rotation 속성은 오브젝트의 방향을 quaternion으로 표현하므로, 이 값으로 transform.rotation을 사용하면 됩니다.

두 번째도 크게 복잡하지 않습니다. quaternion으로 표현된 초기 방향이 주어졌을 때, 초기 방향에 특정 회전을 적용하여 얻는 목표 방향 quaternion은 초기 방향과 적용할 회전 quaternion의 곱으로 구할 수 있습니다.

우리 스크립트에서 적용할 회전은 deltaAngle이며, 현재 도 단위로 표현되어 있습니다. 따라서 이를 Quaternion으로 변환해야 합니다.

다행히 Quaternion 클래스의 Euler 함수가 이를 수행해 줍니다. 이 함수는 세 개의 매개변수, 즉 X, Y, Z 축을 기준으로 한 회전 각도를 받아 해당 변환을 나타내는 quaternion을 반환합니다.

앞서 언급했듯이 목표 quaternion을 얻으려면 초기 quaternion에 회전 quaternion을 곱해야 하므로, Update 안에서 다음과 같이 작성할 수 있습니다.

Quaternion targetRotation = (transform.rotation * (Quaternion.Euler(0f, 0f, deltaAngle)));

그 다음, Quaternion.Slerp로 계산된 quaternion을 transform.rotation에 할당하여 오브젝트의 방향을 업데이트합니다.

transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, evaluationTime);

이제 evaluationTime을 정의해야 합니다. 이는 0과 1 사이의 float 값으로, 초기 방향에서 최종 방향으로 전환되는 과정에서 현재 어느 지점에 있는지를 나타냅니다.

먼저, 스크립트 클래스의 시작 부분에 다음과 같이 변수를 선언합니다.

private float evaluationTime;

그리고 Start 메서드 안에서 다음과 같이 초기화합니다.

evaluationTime = 0f;

이제 evaluationTime 변수는 매 프레임마다 증가해야 합니다. Slerp가 있는 코드 바로 아래에 다음과 같이 작성합니다.

evaluationTime += Time.deltaTime;

물론 이것은 하나의 예시일 뿐입니다. 제 권장 사항은 Time.deltaTime에 변수를 곱하는 것입니다. 이 변수는 Inspector에서 실시간으로 조정할 수 있어 최적의 회전 속도를 찾을 수 있습니다. 이 주제는 Time.deltaTime 튜토리얼에서 다루었습니다.

하지만 이렇게 하면 evaluationTime은 매 프레임마다 증가하므로 결국 1.0에 도달하게 되며, 재설정하지 않으면 계속 증가하게 됩니다.

그렇다면 언제 재설정해야 할까요?

이 질문은 이렇게 바꿔 말할 수 있습니다. 모델의 새로운 회전을 언제 시작할 준비가 되었는가?

정답은 모델이 이미 Player를 향하고 있고, Player가 움직이기를 기다리고 있을 때입니다.

일반적으로 Surveillance Camera 모델이 Player를 향하고 있고 Player가 정지해 있다면, 수행할 회전이 없으므로 deltaAngle은 0이라고 말할 수 있습니다. 그러나 float 값은 특히 서로 다른 단위 간 변환이 있는 경우 약간의 오차가 발생할 수 있으므로, 약간의 여유 범위를 두는 것이 좋습니다. 따라서 deltaAngle의 절댓값이 1f보다 작을 때 애니메이션이 종료된 것으로 간주하고, Player가 움직이면 새로운 회전을 시작하도록 합니다.

따라서 Update 메서드 안에서 targetRotation을 생성하기 직전에 다음과 같이 작성합니다.

if(Mathf.Abs(deltaAngle) < 1f) evaluationTime = 0f;

그리고 이 if 문의 else 블록 안에 다음 세 가지 명령을 작성합니다.

target quaternion 정의

Slerp를 사용한 방향 변경

evaluationTime 증가

수정된 스크립트를 저장하고 Unity 에디터로 돌아가 Play를 눌러 결과를 확인합니다. 이 경우 회전 속도는 Time.deltaTime에 의해 결정됩니다. 앞서 언급했듯이 Time.deltaTime에 변수를 곱하여 Inspector에서 조정함으로써 속도를 줄이거나 늘릴 수 있습니다.

정리하자면, 이번 튜토리얼에서는 회전 각도를 Quaternions로 변환하여 목표 방향을 나타내는 Quaternion을 계산하는 방법을 살펴보았습니다. 그리고 Slerp를 사용하여 더 느린 회전을 구현했으며, Time.deltaTime을 사용해 실행 플랫폼과 무관하게 속도를 조정할 수 있도록 했습니다.

또한 Player가 정지해 있고 다시 움직일 준비가 되었을 때 회전이 다시 시작되도록 Slerp의 재설정 조건을 정의했습니다.

이것으로 두 개의 튜토리얼을 마치겠습니다. 곧 다시 만나요!

이 사이트는 제 작업 일부를 소개하기 위한 목적만을 가지고 있으며, 어떠한 홍보 목적도 포함하지 않습니다. 현재 맞춤 작업, 컨설팅 또는 기타 어떤 형태의 업무 협업에 대한 요청도 받고 있지 않으며, 이에 대해 응답하지 않으니 양해 부탁드립니다.


확장된 개인정보 및 쿠키 사용 정책