Unity라이프사이클과 타이밍

Time.timeScale과 unscaled 시간

일시정지, 슬로모션, UI 타이머를 만들 때 `timeScale`, `unscaledDeltaTime`, `WaitForSecondsRealtime`를 어떻게 구분할지 정리합니다.

마지막 수정 2026년 3월 21일

기본 패턴

csharp
Time.timeScale = 0f;
pauseTimer += Time.unscaledDeltaTime;
yield return new WaitForSecondsRealtime(1f);

설명

  • Time.timeScale은 게임 세계의 시간 흐름 전체를 느리게 하거나 멈추는 전역 배율입니다. 슬로모션, 일시정지, 연출 제어에서 자주 씁니다.
  • Time.deltaTime은 이 배율의 영향을 받지만, Time.unscaledDeltaTime은 영향을 받지 않습니다. 그래서 pause 중에도 돌아야 하는 UI 애니메이션, 메뉴 타이머, 네트워크 timeout 표시에 자주 필요합니다.
  • 코루틴에서도 WaitForSeconds는 timeScale 영향을 받고, WaitForSecondsRealtime는 영향을 받지 않습니다. 이름은 비슷하지만 용도가 다릅니다.
  • 일시정지를 만든다고 해서 모든 시스템을 같은 시간 축에 묶을 필요는 없습니다. "멈춰야 하는 게임플레이"와 "계속 돌아야 하는 UI/시스템"을 분리하는 것이 핵심입니다.
  • timeScale은 강력한 도구이지만 오디오, 애니메이터, 물리, UI까지 전부 같은 방식으로 멈춘다고 단순화하면 곧 예외 처리가 쌓입니다.

빠른 정리

항목timeScale 영향
Time.deltaTime받음
Time.unscaledDeltaTime받지 않음
WaitForSeconds받음
WaitForSecondsRealtime받지 않음
적합한 용도pause UI는 unscaled 계열, 게임플레이는 scaled 계열

주의할 점

pause 구현에서 가장 흔한 실수는 timeScale = 0만 걸고 모든 타이머가 왜 멈췄는지 뒤늦게 발견하는 것입니다. 메뉴 애니메이션, 카운트다운, 툴팁, 로딩 표시는 어떤 시간 축을 따라야 하는지 먼저 분리하는 편이 좋습니다.

참고 링크

3 sources