【Unity】「Update」,「LateUpdate」,「FixedUpdate」の違い
※ほとんど自分用メモ
Unityでスクリプトを書く際に、Update()
、FixedUpdate()
、LateUpdate()
といったメソッドを使い分ける場面はまぁまぁ遭遇します。
(とはいえ割と適当に使っちゃっているんですが。。。)
どれも毎フレーム呼ばれる関数のように見えますが、処理のタイミングや用途が異なるため、間違った場所に処理を書いてしまうと挙動が不安定になったり、パフォーマンスが悪くなったりすることがあるようです。
本記事では、自分自身の備忘録として、これらのメソッドの違いや使い分けの目安、そしてよくある落とし穴をまとめておきます。
ざっくり使い分けイメージ
関数名 | タイミング | 主な用途 | 備考 |
---|---|---|---|
Update() | 毎フレーム | 通常の処理・入力系 | 毎フレーム。速度は一定でない。フレームレート依存。 |
FixedUpdate() | 一定固定 | 物理演算・Rigidbody関連処理 | 一定間隔。物理系の処理はここでする。 |
LateUpdate() | Update の後 | カメラ制御・アニメ調整など | Updateの後で動く。追従して欲しいアニメーション関連などはここに入れる。 |
個人的な使い分けルール(仮)
以下、自分なりにまとめた「何をどこに書くべきか」のざっくりルールです。
- 入力処理 →
Update()
- 物理挙動 →
FixedUpdate()
- カメラ・UI・追従処理 →
LateUpdate()
よくある落とし穴
Update()
でRigidbody.position +=
はNG(物理挙動がバグる)- 物理演算のルールを無視して動かしてしまうことになり、物理挙動がバグる原因になる
Rigidbody
を手動で動かしたい場合は、Rigidbody.MovePosition()
を使うか、FixedUpdate()
内で制御するのが基本
FixedUpdate()
でInput.GetKeyDown()
はNG(入力取りこぼす)- フレームと同期していないため入力の取りこぼしが起きやすい
- キー入力やマウスの検出など、プレイヤーの操作に関するものは
Update()
内で
LateUpdate()
を使わずにカメラ追従するとカクつきやズレが出る- カメラの追従処理を
Update()
に書いてしまうと、追いつかずズレが出てしまう - カメラ制御やUIの調整などは
LateUpdate()
を使うことで「キャラの動きが終わった後に処理する」ことができ、滑らかで自然な動きになる
- カメラの追従処理を
参考リンク
- 間違えやすい!Update・LateUpdate・FixedUpdateの違いを徹底解説【Unity】
- Start,Awake,Update,LateUpdate,FixedUpdateの違い
- Unity公式ドキュメント:Update関数
- Unity公式ドキュメント:FixedUpdate関数
- Unity公式ドキュメント:LateUpdate関数
最後に
一度理解したと思っていても、つい癖で Update()
に全部書いてしまいがちなので、自分自身に向けてのリマインドとしてこの記事を書きました。
今後も開発中に気づいたことや、新しく知った使い分けのコツがあれば、随時追記していこうと思います。