Quick Reference
| 시스템 | pause/slow motion 때 쓸 시간 | timeScale = 0일 때 |
|---|---|---|
| 게임플레이 이동·쿨다운 | deltaTime, Time.time, WaitForSeconds | 멈춥니다. |
| 메뉴 애니메이션·재개 카운트다운 | unscaledDeltaTime, unscaledTime, WaitForSecondsRealtime | 계속 진행합니다. |
| 물리 | fixedDeltaTime | physics step이 진행되지 않습니다. |
| 오디오·네트워크 timeout | 각 시스템의 별도 정책 | timeScale만으로 제어되지 않습니다. |
Time.timeScale의 기본값은 1. 0은 scaled 시간과 물리 진행을 멈추고, 0.3f는 게임 세계의 흐름을 30%로 만듭니다. 단, timeScale을 바꿔도 Time.fixedDeltaTime 속성 값은 자동으로 다시 설정되지 않습니다. 슬로모션에서 물리 step 빈도를 유지하려면 원래 값을 저장해 비례 조정하고, 복구할 때도 저장값을 씁니다.
private float _baseFixedDeltaTime;
private void Awake() => _baseFixedDeltaTime = Time.fixedDeltaTime;
public void SetSlowMotion(float scale)
{
Time.timeScale = scale;
Time.fixedDeltaTime = _baseFixedDeltaTime * scale;
}
public void ResumeGame()
{
Time.timeScale = 1f;
Time.fixedDeltaTime = _baseFixedDeltaTime;
}시간 축을 고르는 기준
일시정지
timeScale = 0은 씬의 모든 일을 멈추는 스위치가 아닙니다. Update 자체는 계속 호출될 수 있지만 deltaTime은 0이 됩니다. WaitForSeconds는 scaled 시간 기준이라 재개하지 않고, WaitForSecondsRealtime은 실제 시간 기준으로 재개합니다. UI Animator가 pause 중에도 움직여야 하면 Animator Update Mode도 Unscaled Time인지 확인해야 합니다.
public void Pause()
{
Time.timeScale = 0f;
pauseMenuPanel.SetActive(true);
}
private void Update()
{
if (!isPaused) return;
countdownSeconds -= Time.unscaledDeltaTime;
countdownLabel.text = Mathf.CeilToInt(countdownSeconds).ToString();
}슬로모션과 fixed timestep
fixedDeltaTime을 그대로 두면 게임 시간 기준 물리 간격은 같지만, 실제 시간으로는 physics step이 더 드물게 실행됩니다. 비용을 줄여도 되는 느린 연출에는 이 선택이 맞을 수 있습니다. 반대로 slow motion 중에도 원래와 비슷한 실제 시간 기준 물리 빈도를 원하면 위 예제처럼 baseFixedDeltaTime * timeScale로 줄입니다. 어떤 선택이든 프로젝트의 원래 Fixed Timestep을 0.02f로 덮어쓰지 마세요.
느린 프레임에서 물리가 따라잡는 양은 Time.maximumDeltaTime에도 제한됩니다. 이를 너무 낮추면 처리할 physics 시간이 잘려 게임 세계가 느려질 수 있고, 너무 높이면 한 프레임에 많은 physics step이 몰릴 수 있습니다. 이 값은 physics-fixed-timestep-tuning 카드에서 예산과 함께 정합니다.
시간 축이 아닌 시스템
AudioSource 재생은 timeScale로 자동 일시정지되지 않습니다. AudioListener.pause, 소스별 ignoreListenerPause, pitch 같은 오디오 정책을 별도로 결정합니다. 네트워크 timeout도 realtime clock 또는 서비스 SDK 규칙을 따르므로, 게임 pause 중 timeout을 멈출지 명시적으로 선택합니다. Particle System과 Animator 역시 각각의 update mode/module 설정을 확인합니다.
빠른 점검
| 증상 | 확인할 값 | 원인 |
|---|---|---|
| pause 메뉴 애니메이션이 멈춤 | deltaTime, WaitForSeconds, Animator Update Mode | scaled 시간에 묶여 있습니다. |
| pause 중 코루틴이 끝나지 않음 | WaitForSeconds/WaitForSecondsRealtime | 대기 시간이 scaled 시간입니다. |
| slow motion 뒤 물리 감각이 달라짐 | 저장한 base timestep, fixedDeltaTime | 하드코딩한 0.02로 복구했거나 의도와 다른 step 빈도입니다. |
| 오디오나 timeout이 계속 감 | listener/SDK 정책 | timeScale 범위 밖의 시스템입니다. |
pause UI에 unscaled 시간을 쓰는 것은 정답이 아니라 정책입니다. 게임플레이와 함께 멈춰야 하는 HUD 효과도 있고, pause 중에도 끝나야 하는 재연결 timeout도 있습니다. 각 시스템에 "pause 중 진행하는가"를 먼저 정한 다음 시간을 선택합니다.
참고 링크
3 sources