Unity技術検証

Time.timeScaleによるゲーム内時間の制御【Unity】

はじめに

ゲームを作っていると、ゲーム内で表現されるあらゆる動き(アニメーション等)を、まとめて停止したいことがあります。

そんなときは、Time.timeScaleの値を変更すると便利なようです。

Time.timeScale

公式によれば、Time.timeScaleとは「時間の経過をスケール」するものだそうです。

正直、厳しい日本語で、理解するのが難しいです。

正確な仕様はわかりませんが、私の解釈があっていれば、これは時間の流れるスピードを制御する変数であり、通常timeScaleの値は1となっています。この値が2になれば、ゲーム内の流れる時間は2倍の速度になります。値が0のときは完全に停止します。

おお、こいつは便利だ。早送り機能なんかはこれで実装できます。

ただ、時間経過を伴う処理の中には、timeScaleに依存するものとそうではないものがあるようで、このあたりを理解していないと、思わぬ挙動をしてしまう可能性があります。

個人的な備忘録

例えば、Update関数はtimeScaleの影響を受けないので、Update内に入力待ち処理を定義している場合は、時間を止めていても問題ないようです。一方FixedUpdateはtimeScaleの影響下にあるため、時間が止まればこちらも実行されません。

他にも機能によって様々な挙動の違いがあるようですが、中には、設定を変更することでtimeScaleの影響を受けずに動作できるものがあります。下記に、個人的に覚えておきたいと思ったものを残しておきます。

  • DOTweenによる処理
    処理に.SetUpdate(true)を付け加えると、timeScaleに依存せず処理される。
    ⇒timeScale=0でも実行される。
  • Timeline、Animator等
    これ系は、だいたいの場合インスペクター上でUpdate方法について聞かれているようで、UnscaledTime的なものを選ぶとtimeScaleに依存せず処理される。
    ⇒timeScale=0でも実行される。
Animatorコンポーネントの場合
PlayableDirector(Timeline)コンポーネントの場合

おわりに

timeScaleにより時間を扱う際は、影響を受けるものとそうでないものを整理し、やりたい処理の内容によって仕様・設計を検討する必要があるのだと思いました。

タイトルとURLをコピーしました