CodeLab技術ブログ

プログラミング技術まとめ

[Unity]UpdateとLateUpdateとFixedUpdateの違い

Unityでスクリプトを新規作成すると、Update()メソッドが必ず入ってくるかと思います。
しかし、サンプルなどを見ると他にもLateUpdate()とかFixedUpdate()などある場合があり、違いが良くわからないので調べてみました。

手っ取り早く簡単にまとめます

Start()

Start()メソッドは、スタート時、つまり初期化時に呼ばれるものです。
1度だけ実行しておきたい処理はここに書きます。

Update()

1フレームごとに呼ばれます。
フレームごとに行う一般的な処理はすべてここに書きます。

LateUpdate()

1フレームごとに呼ばれます。
全てのオブジェクトのUpdate()が行われた後に実行されます。

FixedUpdate()

フレームに関係なく定期的に呼ばれます。

Update()とLateUpdate()がある理由

この2つのメソッドがある理由は、Unityでは各オブジェクトでUpdate()メソッドが呼ばれる順番は保証されていないからです。
たとえば、プレイヤーオブジェクトとプレイヤーに追従するカメラオブジェクトがあるとします。
プレイヤーとカメラで処理する順番が異なると、
・プレイヤーが移動してからカメラが移動
・カメラが移動してからプレイヤーが移動
という2つのパターンが発生してしまいます。
どちらから処理しても大差はないと思いますが、フレームごとに順番がことなるとスムーズな動きになりません。
ですのでこの場合は、
プレイヤーや、その他のオブジェクトの移動はUpdate()メソッドでおこない、LateUpdate()メソッドでカメラの動きを処理すれば、毎フレームすべて移動済み状態で表示されるというわけです。

FixedUpdate()がある理由

Update()は毎フレームごとに呼ばれます。
しかし、FPSは処理状態によってまちまちなので、時間的なタイミングは不定です。
どういうときに困るかというと、たとえば格闘ゲーム。キー入力のタイミングがシビアなので、Update()メソッドで(つまり1フレームごと)入力判定を行っていると、フレームレートによってはキー入力が漏れてしまう可能性があります。
FixedUpdate()であれば、決まった時間ごとで必ず呼ばれますのでそういったことが防げるというわけです。
通常、移動量の計算はTime.deltaTimeで前フレームとの時間差で値を乗算する必要がありますが、FixedUpdate()の場合固定なのでその必要はありません。

ただし、定期的に呼ばれるものなので、これを使うオブジェクト数や処理内容はできるだけ最小限にする必要があります。

まとめ

以上をまとめると

Start:初期化の処理
Update:全般
LateUpdate:カメラの処理
FixedUpdate:主にキー入力。できるだけ使わず必要最小限で!

詳しくはこちらの公式サイトを読むとよいでしょう。
イベント関数の実行順序(Unity2018.1)


コメントは受け付けていません。