Unity

Physics.SimulateでRigidbodyの物理挙動を早送りする【Unity】

Unity
記事内に商品プロモーションを含む場合があります

Unityでシーンの動作を早送りしたい時よく使うのはTime.timeScaleです。しかしDOTweenのアニメーション等にも影響してしまうので今回は物理挙動だけを対象にする方法を探していましたが、それ専用の機能は見当たりませんでした。

Rigidbodyを使った物理挙動だけを対象にするならPhysics.Simulateメソッドを使って手動で時間を進めるというのが正攻法っぽい感じでした。

Physics.Simulateメソッドを使うと引数に指定した時間だけ物理挙動を進めることができます。以下コード例です。

事前にPhysics.autoSimulationをfalseにしておくことが必須条件です。通常は自動で物理挙動が進むところを手動で進めるように変更するわけですね。

ProjectSettings > Physics の Auto Simulation のチェックでも設定できます。

単純に2倍速にしたい場合は

Physics.Simulate(Time.fixedDeltaTime * 2);

のようにすることも可能ですが、Rigidbodyの設定によってはColliderをすり抜けてしまう恐れがあります。

そこで上記のコード例ではPhysics.Simulateを2回呼ぶことによって2倍速にしています。

小数点以下を含む速度の場合、例えば1.5倍速なら

Physics.Simulate(Time.fixedDeltaTime);
Physics.Simulate(Time.fixedDeltaTime * 0.5f);

のように整数部と小数点以下の部分を分けて呼ぶようにしています。なお同様にスローにもできます。

この方法のデメリットとしては圧倒的に処理負荷が増えてしまうことです。本来は1回で済む衝突判定などが何度も実行されることになります。

あくまで一時的な使用に留めるか、すり抜けの心配がない場合であれば引数にTime.fixedDeltaTimeより大きな値を入れても良いかもしれません。