[Unity] ポーズ動作をTime.timeScale=0を使わずに実現する

By | 2014-06-04

ゲーム全体をポーズしたいとき、Time.timeScale=0としてゲームの進行時間を停止すれば簡単に実現できます。
しかし、アニメーションの動作も停止してしまい、ポーズ中に別のアニメーションを動かしたい場合に問題となってきます。
手動で無理やり動かすことも不可能ではないですが・・・

そこで、今回はTime.timeScaleの値を弄らずにポーズ動作を実現する方法について紹介します。

基本的な考え方は、「レンダラ以外のコンポーネントを無効にする」ことです。
アニメーションやコライダー、スクリプトなどのUpdate動作を持つコンポーネントを無効にすると、Update()が呼び出されなくなり、結果として動作を停止させることが出来ます。
レンダラを無効にしないのは、レンダラを無効にするとオブジェクトそのものが描画されなくなってしまうためです。

これらのUpdate()を持つコンポーネントはBehaviourクラスから派生されています。
したがって、これらのクラスのコンポーネントを取得して全て無効にすればよいわけです。

ポーズを行うためのスクリプトを以下にまとめました。
よろしければご自由にお使い下さい。

Pauser.cs

上記のスクリプトをポーズしたいゲームオブジェクトに追加すると、以下の処理でポーズ・ポーズ解除できます。

なお、上記スクリプトはRigidbodyのポーズには対応していません。
これはまた次回以降に書きたいと思います。

一度スクリプトを作れば、スクリプト追加という手間だけでポーズ動作が実現できるため簡単だと思います。

コメントを残す

メールアドレスが公開されることはありません。