【Unity】ゲームの時間を止める方法|時間停止中でもUIアニメーションを動かしたい!

Unity

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アニメーションも止まってしまいます。

これを防ぐ方法が2つあります。

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で制御している場合は、以下の手順で設定を変更します。

  1. 動かしたいオブジェクトのAnimatorコンポーネントを選択
  2. 「Update Mode」を「Unscaled Time」に変更

これだけで Time.timeScale = 0 でもアニメーションが止まりません。

スロー演出なら 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」を有効にしてバックグラウンドの時でもアプリが動作し続けるようにすることで対策ができますが、そこまでしてunscaledDeltaTimeを使わなければならない理由が無いのであれば、使わなくていい処理だと思いました。


まとめ:止めるべき時間と、動かしたい演出を明確に

  • Time.timeScale で時間を止めても、UIの見せ方次第では違和感が出ることがある
  • UIや一部の演出はUnscaledTimeを使うことで自然に動かせる
  • 「何を止めて」「何を動かすか」を整理することが重要

ポーズ演出、演出スロー、一時停止メニューなどの実装では、設計段階で“動かしたい部分”の設計を明確にしましょう。

Unity/C# をもっと体系的に学ぶには?
【現役メンターに質問しながら短期集中】
👉️ Unityコースで学んでみる
タイトルとURLをコピーしました