この記事でのバージョン
Unity 5.3.0f4 Personal
はじめに
ゲーム中にオブジェクトを一時停止したい、みたいな場合はよくあると思います。
その時、一番楽なのはTime.timeScaleを0にして時間を止める事ですが、
これをするとtimeScaleが影響している全ての動きが止まってしまうため、
使える場所が限られています。
移動処理をプログラムで記述している場合は、その処理を実行しなければいいため簡単ですが、
Rigidbodyを使っている場合は、移動処理が自動で行われてるためそうもいきません。
isKinematicを有効にすれば、一時停止する事は出来ますが。
rigidbody2D.isKinematic = true;
速度が0になるため、物理運動の再開は出来ません。
なので、今回はRigidbodyの一時停止&再開処理を拡張メソッドで作ってみました。
RigidbodyExtension
さっそくですが、コードは以下のとおりです。
Rigidbody用のRigidbodyExtensionとRigidbody2D用のRigidbody2DExtensionがありますが、
処理内容は同じです。
この拡張クラスを作成すると、以下のような感じで簡単に一時停止&再開ができるようになります。
//一時停止 gameObject.GetComponent<Rigidbody>().Pause(gameObject); //再開 gameObject.GetComponent<Rigidbody>().Resume(gameObject);
処理内容を簡単に説明すると、
VelocityTmpというコンポーネントを作成し、それに停止前の移動速度と回転速度を記録。
再開時はVelocityTmpから停止前の移動速度と回転速度を取得し反映、
その後、VelocityTmpを消しています。
おわりに
今回はの方法はあくまでtimeScaleを0にしたくない場合なので、
timeScaleをいじっても問題ない場合はそっちの方が楽かと思われます(:3っ)∋〜