概要
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 を使っていきたいと思います。