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
より大きな値を入れても良いかもしれません。