【Unity】Unityの物理計算をスクリプトで制御するときにパフォーマンスを落とさないために気を付けること

Unityの物理計算をスクリプトで制御するときにパフォーマンスを落とさないために気を付けること

Unity2018.4.6

はじめに

UnityはRigidBodyとかColliderとかをアタッチするだけで衝突判定を取ってくれたりと、複雑な物理計算を自動的にやってくれます。
これは便利ではあるのですが、ほぼ毎フレーム複雑な計算をするので処理負荷が掛かりがちです。

そんなわけで、たとえば任意のタイミングで衝突判定を計算したいだけの場合など、
ゲームによっては物理計算のタイミングや計算対象を自前でスクリプトから指定することがあります。

そういったときにはUnityの自動計算をオフにするなどいくつかやらなければいけないことがあるので本記事にまとめました。

シミュレーションをオフにすれば処理負荷が掛からない

まず物理計算を無効にするには、Physics.autoSimulationをfalseにします。

docs.unity3d.com

Profilerで確認するとよくわかりますが、これによりPhysicsの処理負荷が無くなります。
ただしこの状態でPhysics系のAPIを使う際にはその前にPhysics.SyncTransformを呼ぶ必要があります。
これについては次節で説明します。

物理計算をする前にはSyncTransformを呼ぶ

さて前節のPhysics.autoSimulationをfalseにするとUnityの物理計算の処理負荷を無くせます。
ただ、この状態でスクリプトからPhysics系のAPI
つまりPhysics.CheckSphere()とかPhysics.Simulate()とかを呼ぶと上手く動かないと思います。

これはColliderなどがアタッチされたGameObjectのTransformが物理エンジンに反映されていないためです。
反映させるためにはPhysics系のAPIを使う前に一度Physics.SyncTransforms()を呼ぶ必要があります。

これにより各GameObjectのTransformが物理エンジンに反映され、衝突判定などが正確に取れるようになります。

まとめ

まとめると、Unityの物理計算をスクリプトで制御するときには

  • Physics.autoSimulationをfalseにする
  • Physics系のAPIを使う前にPhysics.SyncTransforms()を呼ぶ

という点に注意する必要がありそうです。

参考

docs.unity3d.com

docs.unity3d.com

blogs.unity3d.com