はかせのラボ

私の頭の中を書いていく雑記ブログです

Unity UnityのUpdate達

あいさつ

どうも、はかせです。
今日は熱っぽかったり頭痛や咳が出たりと
とにかく体調が悪かったので開発は休みました。
頭も大して動いていないような気がします。

ただなにも書かないのもあれだと思うので割とハマりやすいと思われる
UnityのUpdate関数達の紹介をしていきたいと思います。
(忘れそうになってたから備忘録がてらというのもある)

Update

毎フレーム呼び出される関数です。
Unityで作ってる人なら多分みんなお世話になっている関数だと思います。

ここには入力や現在の状態の更新などを行うコードを書くとよいと思います。
また他のオブジェクトに対するメッセージングなんかもそれ用のメソッドを用意してここで呼んでやるとうまくいきやすいと思います。
(状態確認を行いやすいのでNullReferenceとかが起きにくい)

ただこの関数はなにもしなければVsyncがオンになっているのと同じタイミングで呼ばれます。
つまり画面更新と同じタイミングですね。
(Vsyncとかについてはこれとかこれをどうぞ)

Updateメソッドが呼ばれる順番は不定です。
なので順番が大事なものはUpdateに書かない方がいいです。
(設定から優先順位をつけることは出来ますがあまり現実的な解決法ではないと思います)

あとUpdateに限った話ではないですがUnityの関数には呼び出しオーバヘッドがかかります。
1つ1つは大してですが数が増えたとき割と馬鹿になりません。
なので必要がなければそもそも書かないか
UpdateManagerみたいな呼び出し代行を作ると多少改善されます。

LateUpdate

Update関数が呼び出し終わった後に呼ばれます。
Updateに比べて知名度が圧倒的に低い気がしますが、
結構大事な関数だと思っています。

明確にUpdate処理の後に行いたい処理、
例えばカメラがプレイヤーを追従する
とかの処理はここに書くとよいと思います。

よくこういった処理は後述するFixedUpdateに書くべきという話がありますが、
こちらの方が確実です。
(Updateの後に呼ばれることが保証されているため)

FixedUpdate

一定時間間隔で呼ばれます。
この時間間隔は設定で変更可能です。
(初期値は0.02秒)

この関数には主に物理挙動を使うようなコードを書くと良いと思います。
UpdateやLateUpdateは単位時間あたりに呼ばれる回数が不定です。
なので処理状況や環境によって動きが早くなったり遅くなったり
瞬間移動したりします。
(多分Unity始めた人がハマることが多いと思われる)

対してFixedUpdateは呼ばれる間隔が決まっているので
常に一定の間隔で動いてくれます。

あとがき

今回はUnityのUpdateについてでした。
私もUpdateだけあればいいじゃんとUnityを始めた当初は思っていました。
ただ色々な環境で開発したりして他のUpdateの必要性を体感しました。
(最初に作ったブロック崩しが倍速になったのはいい思い出w)

色々書きましたが基本的には
・入力や自身のステータスの更新とかはUpdate
・更新された情報を同フレーム内で扱いたければLateUpdate
・物理挙動のような連続的な移動などはFixedUpdate

みたいな感じで使い分けると問題は起きにくいと思います。

それでは今回はこの辺でノシ