(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

Time.timescaleを変更せずにRigidbodyの一時停止&再開処理【Unity】【拡張メソッド】


このエントリーをはてなブックマークに追加


この記事でのバージョン
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っ)∋〜