이 튜토리얼에서는 Unity에서 Time.deltaTime이 무엇인지, 그리고 어떻게 사용하는지 알아보겠습니다.
이 튜토리얼의 동영상 버전은 현재 이 언어로 제공되지 않습니다.
영상 자막 텍스트
안녕하세요 여러분. 이 튜토리얼에서는 Unity에서 Time.deltaTime이 무엇인지, 그리고 어떻게 사용하는지 알아보겠습니다.
이 초보자용 튜토리얼은 Unity에서 C# 스크립팅을 처음 접하는 분들께 적합합니다. 이 주제는 매우 기본적이지만 꼭 제대로 이해해야 하며, 많은 스크립트와 튜토리얼에서 반복적으로 등장하게 됩니다.
이 튜토리얼은 Unity 2022로 제작되었지만, Time.deltaTime은 여러 버전 전부터 존재해 왔고 앞으로도 계속 사용될 가능성이 높습니다.
Time.deltaTime은 이전 프레임과 현재 프레임 사이에 경과된 시간을 초 단위로 나타내는 변수입니다. 즉, 이전 프레임을 완료하는 데 걸린 시간이라고 이해해도 됩니다.

이 값은 보통 오브젝트의 초당 이동 속도에 Time.deltaTime을 매 프레임마다 곱하는 방식으로 사용되며, 움직임과 애니메이션을 프레임 레이트와 무관하게 만들기 위해 사용됩니다.
이렇게 하면 프레임당 이동 거리는 프레임 레이트에 따라 달라지지만, 서로 다른 성능의 디바이스에서도 초당 이동 속도는 동일하게 유지됩니다.
이제 매우 단순한 예제를 통해 설명해 보겠습니다. 일정한 속도로 한 축을 따라 이동하는 오브젝트를 생각해 보겠습니다. 씬에 오브젝트를 하나 추가하고, Isometric 뷰로 위에서 내려다보는 구도로 설정합니다.

해당 오브젝트에 C# 스크립트를 추가하고, 예를 들어 movement라고 이름을 지정합니다. 그런 다음 1초에 1유닛을 이동하기 위한 Vector3 변수를 하나 생성합니다:
private Vector3 obVelocity = new Vector3(0.0f, 0.0f, 1.0f);
Update는 매 프레임마다 호출된다는 것을 알고 있습니다. 하지만 게임이 초당 몇 프레임으로 실행될지는 알 수 없습니다. 이는 여러 가지 요소에 따라 달라지기 때문입니다.
만약 프레임 레이트가 항상 초당 50프레임이라면, obVelocity를 (0.0f, 0.0f, 0.02f)로 수정하여 Update가 호출될 때마다 0.02유닛씩 이동하게 만들 수 있습니다. 그러면 결과적으로 초당 1유닛을 이동하게 됩니다.
하지만 실제로는 프레임 레이트를 고정할 수 없기 때문에, Update 안에 다음과 같이 작성합니다:
transform.position += (obVelocity * Time.deltaTime);

스크립트를 저장하고 Unity 에디터로 돌아가 결과를 확인해 보세요. 오브젝트는 선형으로 이동하며, 씬에서 초당 1유닛의 속도를 유지합니다.
정리하자면, 특정 속도로 오브젝트를 이동시키고 싶다면, 그 속도를 변수에 초당 씬 유닛 단위로 설정한 뒤, Update 함수 안에서 해당 값에 Time.deltaTime을 곱하면 됩니다.
이제 또 다른 예제를 살펴보겠습니다.
현재 사용 중인 씬에서는 Main Camera에 이동 스크립트가 적용되어 있으며, Input.GetAxis를 사용하여 Horizontal과 Vertical 방향의 화살표 키 입력을 감지합니다.
Horizontal과 Vertical의 값은 각각 -1에서 1 사이입니다. 만약 이 값을 Update 함수 안에서 직접 Time.deltaTime과 곱한다면, 초당 1유닛의 이동을 구현할 수 있습니다. 하지만 이 방법은 속도를 조절할 수 없습니다.
이 문제를 해결하기 위해 가장 간단한 방법은 Serialized 수정자가 적용된 private 변수를 하나 정의하는 것입니다. 이렇게 하면 Editor에서 게임을 테스트할 때 Inspector 창에서 해당 값을 확인하고 수정할 수 있습니다.
영상 예제에서는 이 변수를 speed라고 하였고, 초기값은 12입니다.

Update 함수에서는 controller.Move를 통해 이동을 처리합니다. 캐릭터에는 Character Controller 컴포넌트가 연결되어 있으며, Move 함수를 사용하여 이동시킵니다.
이 함수는 다소 긴 매개변수를 받으며, 두 부분으로 나뉩니다.
첫 번째 부분에서는 사용자의 입력을 기반으로 X축과 Z축 방향 이동을 계산합니다. 이 값은 move라는 Vector3 변수에 저장됩니다.
두 번째 부분에서는 점프 시 적용되는 중력 계산이 포함됩니다.

Time.deltaTime은 축 방향 이동 계산과 중력에 의한 수직 이동 계산 모두에 사용됩니다. 하지만 여기서는 두 번째 부분은 다루지 않고, 첫 번째 부분에 집중하겠습니다.
이동 벡터 move는 첫 번째 예제의 큐브와 마찬가지로 Time.deltaTime과 곱해집니다. 또한 float 변수 speed와도 함께 곱해집니다.
그 후 Unity 에디터로 전환하여 게임을 실행하면, Script 탭에서 Speed 파라미터 값을 실시간으로 변경하면서 캐릭터의 이동 속도를 조절할 수 있음을 확인할 수 있습니다.
이렇게 하면 게임 시작 시 적절한 이동 속도를 손쉽게 조정할 수 있습니다.
speed 값은 Time.deltaTime과 곱해지기 때문에, 실행 프레임 레이트와 관계없이 다양한 디바이스에서 동일한 속도로 동작하게 됩니다.
또한 speed는 코드 내의 변수이므로, 게임 도중 특정 이벤트에 따라 값을 변경하는 것도 가능합니다.
예를 들어 플레이어가 이동 속도를 두 배로 증가시키는 포션을 마시거나, 반대로 평소보다 느리게 이동하도록 설정할 수도 있습니다.
중요한 점은 이 속도가 Time.deltaTime 덕분에 프레임 레이트와 독립적이라는 것입니다. 따라서 서로 다른 디바이스에서도 일관된 동작을 보장합니다.
이번 영상에서는 Time.deltaTime의 두 가지 간단한 사용 예제를 살펴보았습니다.
곧 Slerp를 사용한 회전에 관한 영상을 게시할 예정이며, 그 영상에서도 프레임 레이트와 무관하게 일정한 속도의 회전을 구현하기 위해 Time.deltaTime을 사용할 것입니다.
이번 튜토리얼은 여기까지입니다. 곧 다시 만나요.