はじめに
今回はPhysics.autoSimulation
を利用して物理演算のシミュレートのオン・オフを切り替えるという記事になります。
Physics.autoSimulationとは?
UnityEngine.Physics
クラスのstatic
変数であるautoSimulation
を切り替える事で物理演算のシミュレートのオン・オフを切り替えられます。
docs.unity3d.com
private void Start() { Physics.autoSimulation = false; }
具体的にシミュレーションってなんやねんということですが、公式ドキュメントには以下のように記載されていました。
Simulation includes all the stages of collision detection, rigidbody and joints integration, and filing of the physics callbacks (contact, trigger and joints).
// DeepL翻訳
シミュレーションには、衝突検出、リジッドボディとジョイントの統合、物理コールバックのファイリング (コンタクト、トリガー、ジョイント) のすべての段階が含まれます。
Physics-Simulate - Unity スクリプトリファレンス
またたまに勘違いされている方がいますが、Physics.autoSimulation
をfalse
にしたからといってMonoBehaviour.FixedUpdate
が動かなくなるわけではありません。
もっと詳しく
実際にProfiler
を利用してどの箇所がなくなっているのか確認してみましょう。
具体的にはFixedUpdate.PhysicsFixedUpdate
の中身が実行されないようですね(おそらくすぐに抜ける仕様)。
もしかすると他にも関係している処理はあるかもしれませんが(あと2Dもある)、ここが一番負荷的には関係ありそうでした。
手動で物理演算をシミュレートする
公式ドキュメントにも記載されていますが、Physics.autoSimulation = false
の場合でもPhysics.Simulate
を利用することで時間(step
)を進めることができます。
private void Start() { Physics.autoSimulation = false; } private void Update() { Physics.Simulate(Time.fixedDeltaTime); }