はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】Physics.autoSimulationを用いて物理演算のシミュレートのオン・オフを切り替える

はじめに

今回はPhysics.autoSimulationを利用して物理演算のシミュレートのオン・オフを切り替えるという記事になります。

Physics.autoSimulationの動作

Physics.autoSimulationとは?

UnityEngine.Physicsクラスのstatic変数であるautoSimulationを切り替える事で物理演算のシミュレートのオン・オフを切り替えられます。
docs.unity3d.com

private void Start()
{
    Physics.autoSimulation = false;
}
Physics.autoSimulationの動作

具体的にシミュレーションってなんやねんということですが、公式ドキュメントには以下のように記載されていました。

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.autoSimulationfalseにしたからといってMonoBehaviour.FixedUpdateが動かなくなるわけではありません。

もっと詳しく

実際にProfilerを利用してどの箇所がなくなっているのか確認してみましょう。

← True, Flase →

具体的にはFixedUpdate.PhysicsFixedUpdateの中身が実行されないようですね(おそらくすぐに抜ける仕様)。

もしかすると他にも関係している処理はあるかもしれませんが(あと2Dもある)、ここが一番負荷的には関係ありそうでした。

手動で物理演算をシミュレートする

公式ドキュメントにも記載されていますが、Physics.autoSimulation = falseの場合でもPhysics.Simulateを利用することで時間(step)を進めることができます。

private void Start()
{
    Physics.autoSimulation = false;
}

private void Update()
{
    Physics.Simulate(Time.fixedDeltaTime);
}