Unityでゲームを作っていると、「一時停止したい」「時間を止めたい」という場面は意外と多くあります。
ポーズメニュー、演出、スロー演出、ヒットストップ——そのたびに思い出すのが Time.timeScale = 0 ですが、とりあえず考えなしに使うと、UIアニメーションを含めて全ての時間が止まってしまいます。
今回は「ゲームの時間を止める方法」について整理しながら、時間を止めてもUIだけは動かしたい!というシーンにも対応できる方法をご紹介します。
Time.timeScaleの基本:全体の時間を止める
最も有名な方法はこれです。
Time.timeScale = 0f;
これを実行すると、Time.deltaTime を使っている処理がすべて止まります。
つまり、Update() 内のアニメーション、移動、物理挙動などがストップします。
時間を止める処理の一例
// ポーズボタンを押したときの処理
public void PauseGame()
{
Time.timeScale = 0f;
// ポーズメニューを開くなどの処理(省略)
}
// ポーズ解除ボタンを押したときの処理
public void ResumeGame()
{
// ポーズメニューを閉めるなどの処理(省略)
Time.timeScale = 1f;
}
止まらないもの・止まりすぎるものに注意
Time.timeScale を使うとき、止まらないもの/実は止まるものの違いに注意が必要です。
止まらないものの例
Update()内でTime.unscaledDeltaTimeを使っている処理- Animatorの「Update Mode」が
Unscaled Timeのもの - DOTweenなどの「時間無視オプション」を使ったTween
実は止まるもの(結構困る)
- 通常のUIアニメーション
- DOTweenで
SetUpdateを使っていないTween
ゲームを止めつつUIだけは動かしたい
本題に入ります。
よくあるのが「ポーズメニューの演出を再生したい」というシーン。
ここで Time.timeScale = 0 にしてしまうと、UIアニメーションも止まってしまいます。
これを防ぐ方法が3つあります。(26/1/6加筆修正)
① DOTweenのSetUpdate(true) を使う

※DOTweenの導入が済んでいない方は、Unity Asset Storeで購入(無料)後、Package Managerでインポートとセットアップをしておきましょう。
using DG.Tweening;
//中略
uiPanel.transform.DOScale(1f, 0.5f)
.SetUpdate(true); // ← 時間停止中でも動く!
UIパネルの大きさを等倍に戻す動きのTweenの例です。.SetUpdate(true) を付加することで、Time.timeScale = 0 の状態でもDOTweenアニメーションが動きます。
UIまわりで演出を動かしたいときは重宝します。
② AnimatorのUpdate ModeをUnscaled Timeにする

アニメーションをAnimatorで制御している場合は、以下の手順で設定を変更します。
- 動かしたいオブジェクトのAnimatorコンポーネントを選択
- 「Update Mode」を「Unscaled Time」に変更
これだけで Time.timeScale = 0 でもアニメーションが止まりません。
③ Time.unscaledDeltaTime を使う
transform.Rotate(0f, 0f, -30f * Time.unscaledDeltaTime);
Time.deltaTime を使っている処理なら、このように修正するだけで動きます。
番外: スロー演出なら timeScale = 0.1f
一時停止ではなくスローモーション演出なら、以下のように値を下げるだけでOKです。
Time.timeScale = 0.1f;
ゲーム全体が10%の速さ(スロー)になりますので、同様に「SetUpdate(true)」や「Unscaled Time」を使ってUIアニメーションを処理すれば、UIメニューは通常速度のまま、背後のゲーム画面だけスローモーションということができます。(FINAL FANTASY 7 REMAKEのコマンドメニューっぽい演出になります)
おまけ:Time.unscaledDeltaTime のこと
unscaledDeltaTimeとは、timeScaleに影響されない独自の時間軸を持つdeltaTimeです。
先程③の方法として紹介しましたが、ウィンドウが非アクティブ時も時間が経過してしまう特徴があります。つまり、ウィンドウが非アクティブからアクティブに戻った時に一気に時間が進んだような感じになってしまいます。
このような挙動を織り込んだ上で、UI演出などのゲーム進行に問題がない範囲で使うべきでしょう。
一応、「Run In Background」を有効にしてバックグラウンドの時でもアプリが動作し続けるようにすることで時間ワープの対策ができますが、アプリがスリープしない分普通に端末のバッテリーを消費します。そもそもそこまでしなければならない設計自体を見直したほうがよいかもしれません。
まとめ:止めるべき時間と、動かしたい演出を明確に
Time.timeScaleで時間を止めたときに、UIを動かす方法は主に3つ!- DOTweenのSetUpdate(true)
- AnimatorのUpdate ModeをUnscaled Time
- Time.unscaledDeltaTime
- 「何を止めて」「何を動かすか」を整理することが重要
ポーズ演出、演出スロー、一時停止メニューなどの実装では、設計段階で“動かしたい部分”の設計を明確にしましょう。

