LoginSignup
11

【Unity】3D 物理演算が Update で演算できるようになりました【2022.2 から】

Last updated at Posted at 2023-03-14

概要

Unity 2022.1 以前のバージョンでは、3D 物理演算が FixedUpdateUpdate の間で実行され、FixedUpdate と紐づくようになっていました。
しかし 2022.2 から新たな実行タイミングの設定が追加され、
3D 物理演算を Update に紐づくことができるようになり、Update() 後に必ず物理演算させる ことができるようになりました。

この記事では物理演算の実行タイミングの設定方法を説明して、実際にその効果を確認します。

FixedUpdate 物理演算のクセについて、 FixedUpdate に関する別記事 の前半でまとめていますので、気になる方は是非そちらもご覧ください mm

設定方法

Unity 2022.2 を起動して、Edit > ProjectSettings を開き、
Physics のタブで、Simulation Mode という物理演算の実行タイミングに関する設定があります。

設定は FixedUpdate、Update、Script の3つの選択肢があり、Update を選ぶと Update() 後に物理演算が実行されるようになります。
physics-simulationmode.png

また、アプリケーション実行中でも、下記のようなコードで、演算方法を動的に変えることができます:

public void SetSimulationModeToUpdate()
{
    Physics.simulationMode = SimulationMode.Update;
}

/* SimulationMode の定義
enum SimulationMode
{
    FixedUpdate,
    Update,
    Script,
}
*/

確認してみた

現状、SimulationMode.Update における物理演算の公式説明がまだ多くありませんが、
実際に SimulationMode.Update に設定して、プロファイラーを見ると、 Update の直後に物理演算用の PhysicsLateUpdate のセッションが追加されていることが確認できます。(下図の オレンジ部分
Update_PhysicsSimulation.png

下記の検証動画では、FixedUpdate 時では OnCollisionStay()Update() 直前で呼ばれて、時々すっ飛ばされますが、
Update に設定すると OnCollisionStay() のタイミングが Update() 後になり、また、安定して呼ばれていることが確認できました。

Physics.autoSimulation の扱いについて

enum SimulationMode の導入により、Physics.autoSimulationObsolete になり、simulationMode のほうを使用することが推奨されるようになりました。
Physics.autoSimulation に真偽値を代入する時に、 true は内部的に SimulationMode.FixedUpdate
false は内部的に SimulationMode.Script が代入されます。

結構前に Physics2D のほうで SimulationMode2D の設定が実装されましたが、2022.2 から 3D のほうの Physics でもサポートされるようになりました。

別記事の「Rigidbody を用いた移動でよく出る不具合と、FixedUpdate 改造による解決法の提案【Unity】」の前半でも解説しましたが、FixedUpdate での物理演算はクセがあって、知らずに踏むと中々解決できませんので、
今回の機能追加は個人的にとても嬉しくて、これから新規のプロジェクトはガンガン SimulationMode.Update を使っていきたいと思います。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11