【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() に全部書いてしまいがちなので、自分自身に向けてのリマインドとしてこの記事を書きました。
今後も開発中に気づいたことや、新しく知った使い分けのコツがあれば、随時追記していこうと思います。

\ 最新情報をチェック /

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です