UpdateとFixedUpdate

UpdateとFixedUpdateの違い

関数概要
FixedUpdate固定された間隔で呼ばれる
Update毎フレームの更新時に呼ばれる
LateUpdateUpdateの後に呼ばれる

Updateは1フレーム毎に呼ばれる関数で、間隔は処理能力に依存するので一定ではありません。 対してFixedUpdateは固定された間隔で呼ばれる関数になります。 また、 LateUpdate というものもあって、こちらは各フレームの最後に実行されます。

フレーム毎の処理の違いをより具体的に説明すると、

  • FixedUpdateは処理落ちした場合1フレームに複数回実行されて帳尻を合わせるという挙動を行います。 Time.fixedDeltaTimeの値は固定のまま、実行回数で調整している
  • Updateは処理落ちした場合にはそのフレームでは実行されず、次のフレームでTime.deltaTimeの値が変動する事で調整される

のようになっています。

使い分け

使い分けとしては、物理挙動の更新が時間進行単位で行われていることから、FixedUpdateは力を適用したり Rigidbody の設定を変更する際に使用する事が推奨されています。 Update はその他の大抵のフレーム更新作業で使用するようにします。 カメラなどに設定して「ステージ上の要素の Update が終わった後に画面を描画したい場合」などには LateUpdate を使用します。

void Update() {
  ...
}
void FixedUpdate() {
  ...
}
void LateUpdate() {
  ...
}

呼ばれる間隔

Updateは30fpsの場合0.03秒間隔で呼ばれます。

FixedUpdateはデフォルトでは50fps換算の0.02秒毎に呼ばれます。

Edit > Project Settings > Time > TimeManager > FixedTimestep で変更する事ができるようになっています。

要素を等速で回転させたい場合

UpdateはCPUの処理能力に依存するため一定では無いので、

transform.Rotate(100);

とすると等間隔に回転するわけではなく、カクカクなってしまう。 時間経過に合わせて等間隔に回転させたい場合には

transform.Rotate(new Vector3(0, Time.deltaTime * 100, 0));

とする事で時間経過毎に同じ角度づつ回転させる事が可能になる。

Time.deltaTimeは前のフレームから経過した差分の秒数が入っています。