はじめに
ゲームを作っていると、ゲーム内で表現されるあらゆる動き(アニメーション等)を、まとめて停止したいことがあります。
そんなときは、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でも実行される。
![](https://obecogames.com/wp-content/uploads/2023/08/unscaled_animator-1.jpg)
![](https://obecogames.com/wp-content/uploads/2023/08/unscaled_timeline.jpg)
おわりに
timeScaleにより時間を扱う際は、影響を受けるものとそうでないものを整理し、やりたい処理の内容によって仕様・設計を検討する必要があるのだと思いました。