Time.deltaTime란 무엇이며 어떻게 작동하나요?
Source: Dev.to

Time.deltaTime란?
Time.deltaTime을 이해하려면 먼저 Update() 메서드가 무엇인지 알아야 합니다.
Update()는 Unity의 메인 플레이어‑루프 메서드이며 매 프레임마다 호출됩니다. Update() 안에 넣은 코드는 매 프레임 실행되며, 보통 캐릭터 이동 로직이 여기에 들어갑니다.
버튼을 눌렀을 때 1 유닛 이동하도록 코드를 작성하면, 프레임 레이트가 다른 기기에서는 캐릭터가 다른 거리를 이동합니다. 기기가 빠를수록 Update()가 초당 더 많이 실행되고, 캐릭터는 더 멀리 이동합니다.
실제 문제: FPS
근본 원인은 Frames Per Second (FPS) 입니다.
- FPS가 높을수록 →
Update()가 더 자주 호출 → 초당 이동 횟수가 늘어남 → 이동 속도가 빨라짐. - FPS가 낮을수록 →
Update()가 덜 호출 → 초당 이동 횟수가 줄어듦 → 이동 속도가 느려짐.
Time.deltaTime은 **마지막 프레임 이후 경과한 시간(초)**을 제공함으로써 이 문제를 해결합니다. 이동량에 Time.deltaTime을 곱하면 프레임당 이동을 초당 이동으로 변환해, 하드웨어에 관계없이 일관된 동작을 보장합니다.
어떻게 작동하나요?
예시 1: Time.deltaTime 없이
| 머신 | FPS | 프레임당 이동량 | 초당 이동량 |
|---|---|---|---|
| 느린 PC | 60 | 1 유닛 | 60 × 1 = 60 유닛 |
| 빠른 PC | 120 | 1 유닛 | 120 × 1 = 120 유닛 |
결과: 빠른 기기일수록 캐릭터가 더 빨리 움직여 원하지 않는 동작이 발생합니다.
예시 2: Time.deltaTime과 함께
| 머신 | FPS | Time.deltaTime (초) | 프레임당 이동량 (1 × deltaTime) | 1 초 후 이동량 |
|---|---|---|---|---|
| 느린 PC | 60 | ≈ 0.01666 | 0.01666 유닛 | 0.01666 × 60 = 1 유닛 |
| 빠른 PC | 120 | ≈ 0.00833 | 0.00833 유닛 | 0.00833 × 120 = 1 유닛 |
결과: FPS와 관계없이 캐릭터 이동이 일관됩니다.
사용 방법
Update() 안에서 프레임당 값(예: 속도)에 Time.deltaTime을 곱하기만 하면 됩니다:
// 초당 1 유닛씩 앞으로 이동
transform.Translate(Vector3.forward * 1f * Time.deltaTime);
// 또는 커스텀 속도 변수를 사용할 때
transform.position += movementSpeed * Time.deltaTime * transform.forward;
핵심 요약
프레임 레이트에 독립적인 동작을 Update()에서 수행해야 할 경우, 항상 Time.deltaTime을 사용하세요. 기기의 성능에 따라 동작이 달라지길 원하지 않는 한, 시간 기반 이동은 Time.deltaTime 없이 사용하지 않는 것이 좋습니다.