

Many Unity developers run into strange behavior after pausing their game using Time.timeScale = 0. Coroutines stop working. Physics freezes. Animations behave unexpectedly. UI timers break.
This is often described as a “Time.timeScale bug,” but in reality, Unity is doing exactly what it is designed to do.
The confusion comes from not fully understanding what Time.timeScale actually controls.
This article explains how pausing affects coroutines, physics, animations, and timers, and how to pause your game safely without breaking systems.
Time.timeScale controls how fast time passes in your game.
Default value:
Time.timeScale = 1f;
Slow motion example:
Time.timeScale = 0.5f;
Pause example:
Time.timeScale = 0f;
When set to zero, all time-based calculations that rely on Time.deltaTime stop progressing.
Unity’s physics engine runs using FixedUpdate(), which depends on time progression.
When Time.timeScale = 0:
FixedUpdate() stops runningThis is expected behavior.
If you need physics to continue during pause (rare case), you must simulate physics manually or avoid using timeScale for that system.
Coroutines that use WaitForSeconds are affected by timeScale.
Example:
yield return new WaitForSeconds(2f);
If timeScale is zero, this coroutine will never continue, because scaled time is not advancing.
This is one of the most common sources of confusion.
Use WaitForSecondsRealtime instead:
yield return new WaitForSecondsRealtime(2f);
This uses unscaled time and works even when the game is paused.
By default, Animator components are affected by timeScale.
If you pause the game, animations stop.
If you want UI animations to continue during pause, change the Animator update mode:
Now the animation ignores timeScale.
Many developers create timers like this:
timer += Time.deltaTime;
When timeScale is zero, Time.deltaTime becomes zero.
The timer stops.
If you need a timer that runs during pause, use:
timer += Time.unscaledDeltaTime;
Important detail: Update() continues running even when timeScale is zero.
But:
Time.deltaTime becomes 0FixedUpdate() stopsThis means input handling and UI logic can still work while the game is paused.
If you use WaitForSeconds, they will freeze.
UI animations that depend on deltaTime will stop unless switched to unscaled time.
Always restore timeScale when unpausing:
Time.timeScale = 1f;
Simple pause manager:
public void PauseGame()
{
Time.timeScale = 0f;
}
public void ResumeGame()
{
Time.timeScale = 1f;
}
For UI timers or animations that must continue:
Time.unscaledDeltaTimeWaitForSecondsRealtimeInstead of using timeScale, you can manually disable gameplay systems:
This avoids global time freezing and gives more control.
No. Unity is working as intended. Time.timeScale scales all time-dependent systems. When set to zero, scaled time stops completely.
The issue only appears to be a bug when developers expect certain systems to ignore timeScale.
The Unity Time.timeScale “bug” is really a misunderstanding of how scaled and unscaled time work.
When you pause using Time.timeScale = 0:
To build a reliable pause system, use unscaled time for UI and real-time systems, and scaled time for gameplay systems.
Once you separate those two concepts, pausing becomes predictable and stable.