テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

Timescale0で時間を停止中でもアニメーションを再生したい

Time.Timescaleは時間の再生速度だ。これを早くすればゲームが早くなるし、これを0にすればゲームは止まる。

止まる範囲は広く、例えばWaitForSecondsであったり、アニメーションであったり、rigidbodyであったり。Time.timeも容赦なく止まる。

[Unity]アプリ内とアプリ外、2つの経過時間について
http://terasur.blog.fc2.com/blog-entry-562.html

TimeScaleはゲームを一時停止させるには非常に便利な方法だが、この方法ではアニメーションが停止してしまう。ただTimeScaleを使用せずにゲームを一時停止させるのは正直面倒だ。


実はアニメーションならばTimescaleが0の場合でも動かそうと思えば動かせる。
方法は簡単、下のコードをTimeScaleが0でも動かしたいキャラクターモデルにアタッチするだけ。

やってることはrealtimeSinceStartupとanimationState.Lengthの余りでanimationState.timeの時間を設定しているだけ。ブレンドとか考えだすと色々と面倒なコードを足す必要があるかもしれないが、ポーズ中の画面など大して複雑な処理はしないと思うし、これで良いんじゃないかと思う。

これはloopの例なので、onceとかpingpongする場合はちょっと工夫する必要がある。

なお、timescaleを0にする事で色々な問題が発生するらしい。
【Unity Action】 ポーズメニュー怖い(Time.timeScale = 0 関連の話)
http://hideapp.cocolog-nifty.com/blog/2013/06/unity-action-ti.html

特にアニメーションイベントが取得出来ないのはちょっと面倒かもしれない…が、ポーズ中にアニメーションイベントが必要になることは多分無いので、多分問題なし。多分多分。