概要
Unity 2022.1 以前のバージョンでは、3D 物理演算が FixedUpdate
と Update
の間で実行され、FixedUpdate
と紐づくようになっていました。
しかし 2022.2 から新たな実行タイミングの設定が追加され、
3D 物理演算を Update に紐づくことができるようになり、Update()
後に必ず物理演算させる ことができるようになりました。
この記事では物理演算の実行タイミングの設定方法を説明して、実際にその効果を確認します。
※ FixedUpdate
物理演算のクセについて、 FixedUpdate に関する別記事 の前半でまとめていますので、気になる方は是非そちらもご覧ください mm
設定方法
Unity 2022.2 を起動して、Edit > ProjectSettings を開き、
Physics のタブで、Simulation Mode という物理演算の実行タイミングに関する設定があります。
設定は FixedUpdate、Update、Script の3つの選択肢があり、Update を選ぶと Update()
後に物理演算が実行されるようになります。
また、アプリケーション実行中でも、下記のようなコードで、演算方法を動的に変えることができます:
public void SetSimulationModeToUpdate()
{
Physics.simulationMode = SimulationMode.Update;
}
/* SimulationMode の定義
enum SimulationMode
{
FixedUpdate,
Update,
Script,
}
*/
確認してみた
現状、SimulationMode.Update
における物理演算の公式説明がまだ多くありませんが、
実際に SimulationMode.Update
に設定して、プロファイラーを見ると、 Update の直後に物理演算用の PhysicsLateUpdate のセッションが追加されていることが確認できます。(下図の オレンジ部分 )
下記の検証動画では、FixedUpdate
時では OnCollisionStay()
が Update()
直前で呼ばれて、時々すっ飛ばされますが、
Update
に設定すると OnCollisionStay()
のタイミングが Update()
後になり、また、安定して呼ばれていることが確認できました。
Physics.autoSimulation の扱いについて
enum SimulationMode
の導入により、Physics.autoSimulation
が Obsolete になり、simulationMode
のほうを使用することが推奨されるようになりました。
Physics.autoSimulation
に真偽値を代入する時に、 true
は内部的に SimulationMode.FixedUpdate
、
false
は内部的に SimulationMode.Script
が代入されます。
結
結構前に Physics2D
のほうで SimulationMode2D
の設定が実装されましたが、2022.2 から 3D のほうの Physics
でもサポートされるようになりました。
別記事の「Rigidbody を用いた移動でよく出る不具合と、FixedUpdate 改造による解決法の提案【Unity】」の前半でも解説しましたが、FixedUpdate
での物理演算はクセがあって、知らずに踏むと中々解決できませんので、
今回の機能追加は個人的にとても嬉しくて、これから新規のプロジェクトはガンガン SimulationMode.Update
を使っていきたいと思います。