티스토리 뷰

게임/유니티

유니티에서 Time.delta란?

박완희버서커 2025. 11. 9. 22:28
반응형
유니티 Time.deltaTime 완벽 이해: 프레임 속도 차이로 인한 문제와 해결 방법

유니티 Time.deltaTime 완벽 이해: 프레임 속도 차이로 인한 문제와 해결 방법


문제점: Update 함수의 컴퓨터 성능 차이로 인한 불균형

유니티(Unity)에서 Update() 함수는 모든 프레임이 실행될 때마다 호출되는 함수입니다. 문제는 컴퓨터마다 프레임 속도(FPS)가 다르다는 것입니다.
  • 어떤 PC는 초당 120프레임으로 매우 빠르게 동작하고,
  • 어떤 PC는 초당 30프레임으로 느리게 동작합니다.
즉, 한 PC에서는 Update()가 120번 실행되고, 다른 PC에서는 30번밖에 실행되지 않습니다. 결과적으로, 같은 코드라도 고성능 PC에서는 물체가 훨씬 많이 움직이는 현상이 발생합니다. 이 차이는 결국 게임 속 캐릭터 속도, 총알 속도, 애니메이션 타이밍 등을 전부 달라지게 만듭니다.

Update 사용 시 결과 차이

다음 코드를 예로 들어 보겠습니다.
void Update()
{
    transform.Translate(Vector3.forward * 5);
}
이 코드는 한 프레임마다 5만큼 앞으로 이동하라는 뜻입니다. 그런데 프레임 수가 다르면 결과가 완전히 달라집니다.
컴퓨터 초당 프레임 수(FPS) 1초 동안 호출 횟수 1초 동안 이동 거리
고성능 PC 120fps 120번 5 × 120 = 600
일반 PC 60fps 60번 5 × 60 = 300
저성능 PC 30fps 30번 5 × 30 = 150

즉, 컴퓨터가 빠를수록 이동 속도가 빨라지고, 느릴수록 느려집니다. 이 문제는 실제 게임에서 심각한 불균형을 유발합니다. 예를 들어, 멀티플레이 게임이라면 같은 코드임에도 한쪽 캐릭터가 훨씬 빨리 움직일 수 있습니다.

Time.deltaTime의 정의

이 문제를 해결하기 위해 유니티는 Time.deltaTime이라는 변수를 제공합니다. 정의:
Time.deltaTime은 “이전 프레임이 끝나고 현재 프레임이 시작되기까지 걸린 실제 시간(초 단위)”입니다.
즉, Time.deltaTime은 매 프레임마다 값이 달라지며, 프레임 속도에 따라 자동으로 조정됩니다. 예를 들어,
  • 60fps라면 한 프레임당 약 0.0166초
  • 30fps라면 한 프레임당 약 0.0333초
이 값을 이용하면 시간을 기준으로 한 일정한 속도를 구현할 수 있습니다. 프레임 속도에 관계없이 동일한 시간 동안 동일한 거리를 이동시키는 것입니다.

해결방법: Time.deltaTime을 이용한 보정

이제 Time.deltaTime을 코드에 반영해 보겠습니다.
void Update()
{
    transform.Translate(Vector3.forward * 5 * Time.deltaTime);
}
이 코드는 “매 초마다 5만큼 이동하라”는 의미가 됩니다. 즉, 컴퓨터가 얼마나 빠르든 느리든, 1초 동안 이동하는 거리는 항상 일정하게 유지됩니다. 아래 표는 이 원리를 수치로 보여줍니다.
컴퓨터 FPS deltaTime 값 1초 동안 이동 거리
고성능 PC 120fps 0.0083 5 × 0.0083 × 120 = 5
일반 PC 60fps 0.0166 5 × 0.0166 × 60 = 5
저성능 PC 30fps 0.0333 5 × 0.0333 × 30 = 5

결과적으로 어떤 환경에서도 1초 동안 정확히 5 단위만큼 이동합니다. 즉, 프레임 속도의 영향을 완벽히 제거한 것입니다.

Time.deltaTime 적용 후에도 생길 수 있는 미세한 차이

Time.deltaTime을 적용하면 대부분의 경우 프레임 차이를 보정할 수 있지만, 아주 낮은 FPS에서는 약간의 부자연스러움이 생길 수 있습니다. 예를 들어 10fps처럼 극도로 느린 환경에서는 한 프레임이 0.1초이므로, 한 번에 너무 멀리 이동하게 됩니다. 이로 인해 캐릭터가 “점프하듯” 이동하거나, 물체의 충돌 감지가 부정확해질 수 있습니다. 이를 완화하려면 다음과 같은 방법을 사용할 수 있습니다.
  • FixedUpdate()Time.fixedDeltaTime을 이용하여 일정한 간격으로 물리 연산 처리
  • 보간(Interpolation) 기능을 사용해 프레임 사이 움직임을 부드럽게 연결
  • deltaTime 상한값 제한 (Mathf.Min(Time.deltaTime, 0.05f))을 두어 프레임 드랍 시 급격한 변화를 완화
이렇게 하면 낮은 사양에서도 좀 더 자연스러운 동작을 유지할 수 있습니다.

요약 및 결론

구분 설명
문제점 Update()는 프레임마다 실행되어 컴퓨터 성능에 따라 속도 차이가 발생함
원인 고성능 PC는 더 많은 프레임을 계산하므로 이동 횟수가 많아짐
Time.deltaTime 정의 “한 프레임이 걸린 실제 시간(초 단위)”
해결방법 속도 계산식에 Time.deltaTime을 곱해 프레임 독립적 이동 구현
보정 결과 FPS와 관계없이 동일한 실제 이동 거리 확보
추가 개선 FixedUpdate()fixedDeltaTime, 보간, 상한값 제한 등을 통해 저FPS에서도 부드러운 움직임 구현

결론적으로, Time.deltaTime모든 프레임 속도 환경에서 동일한 속도, 동일한 타이밍, 동일한 물리 효과를 보장하는 핵심 요소입니다. 만약 Update() 함수 안에서 움직임이나 회전, 타이머 등을 다룬다면, 반드시 Time.deltaTime을 곱해주는 습관을 가져야 합니다. 이 한 줄의 보정이 게임의 품질과 일관성을 결정합니다.
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/11   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
글 보관함
반응형