しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

UnityのUpdateとFixedUpdateの違いを確認する

Unityのフレーム毎に呼ばれる関数はUpdateとFixedUpdateがあります。
今回はこの2つの違いを確かめてみます。

UpdateとFixedUpdateの違い

2つはFixedUpdateは1秒間あたりの呼び出し回数が固定、Updateは端末の状態によって変わることがあるという違いがあります。
Updateは1フレーム毎に呼び出されるので、端末の描画速度によって変化するのです。

UpdateとFixedUpdateの違いの確認

まずは2つのメソッドが呼ばれることを確認します。
下のようにログ出力処理を追加します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MyScript : MonoBehaviour {
    private void Update () 
    {
        Debug.Log("Update");
    }

    private void FixedUpdate()
    {
        Debug.Log("FixedUpdate");
    }
}

コンソールを見るとログが出ている事が分かります。
下の方のログを見るとUpdateとFixedUpdateの呼ばれるタイミングが一定ではない事が分かります。

f:id:llcc:20180602180345p:plain

FixedUpdateの呼ばれるタイミングはEdit → Project Settings → Timeで設定する事ができます。
Fixed Timestepを変えればその秒数毎にFixedUpdateが呼ばれるようになります。

f:id:llcc:20180602181404p:plain

実際にFixed Timestepを1秒に変更したところ、FixedUpdateは1秒に1回だけ呼ばれるようになりました。

f:id:llcc:20180602181636p:plain

FixedUpdateはTime.timeScaleにも影響を受けます。
例えば下のようにtimeScaleを0にすればFixedUpdateは呼ばれなくなります。
もしtimeScaleを0.1にした場合はFixedUpdateはtimeScale=1の10分の1の頻度で呼ばれるようになります。

public class MyScript : MonoBehaviour {
    private void Start()
    {
        Time.timeScale = 0;
    }

    private void Update ()
    {
        Debug.Log("Update");
    }

    private void FixedUpdate()
    {
        Debug.Log("FixedUpdate");
    }
}

UpdateとFixedUpdateの使い分け

FixedUpdateは時間のカウントアップなど、一定のタイミングで呼ばれてほしい処理を記述するのがオススメです。
一方でUpdateはInput関連をセットするのがオススメです。
というのもInputは入力したフレームでしか有効にならないのでFixedUpdateではフレームとのタイミングがずれて入力を検知できない事があります。
そのため、Inputはフレーム毎に呼ばれるUpdateに書く必要があります。

まとめ

UpdateとFixedUpdateなどは微妙な違いなので再現性の低い不具合などに繋がりそうだと感じました。
今後はこの辺りもしっかり意識しつつ開発をしていきたいと思います。