【Unity】Time.deltaTimeの使い方と落とし穴、fixedDeltaTimeとの違い【GIFアリ】

に公開
使い方と落とし穴シリーズ一覧

一言

  • Time.deltaTime を学習しようとしているあなたは えらいっ
  • Unity初心者のとき、よくこの辺でやらかしてました(友人PCでのみ爆速でキャラが動く等)

Time.deltaTimeとは

  • 直前のフレームと現在のフレームの間隔を表現するプロパティ
  • 低FPSほど大きい、高FPSほど小さい値を返す(秒単位)

Time.deltaTimeを使う理由

  • フレーム間の時間差を補正し、常に一定のペースでオブジェクトを動作させるため
  • 速度 × 経過時間 = 移動量

例:Time.deltaTimeを用いず、Transform.Translateでオブジェクト移動

float speed = 3f;
transform.Translate(speed * Vector3.right);
  • 移動速度は常に同じだが、フレームレートに移動距離が依存しており、上記の振る舞いになる

例:Time.deltaTimeを用いて、Transform.Translateでオブジェクト移動

float speed = 3f;
transform.Translate(speed * Time.deltaTime * Vector3.right);
  • フレームレートに依らず速度が維持できている

Time.deltaTimeの使い方

  • 時間に応じた量の計算に使うとイイ
//移動量
float speed = 1.0f;
Vector3 moveVec = speed * Time.deltaTime * Vector3.right;
transform.Translate(moveVec);

//回転量
float rotateSpeed = 90f; // 1秒で90度回転
transform.Rotate(rotateSpeed * Time.deltaTime * Vector3.up);

落とし穴:スロー演出、ポーズ演出

  • Time.deltaTimeTime.timeScaleに影響を受ける
  • そのため、スロー演出などで timeScale = 0.5f にすると deltaTime も半分になる
  • ポーズ演出でtimeScale = 0.0fにした場合、最悪動かなくなるケースもアリ

スローでも一定の時間で処理を行うならTime.unscaledDeltaTime

  • 使い方は特に変わらない
  • もちろんポーズでtimeScale = 0.0f にした場合も有効
float speed = 90f;
transform.Rotate(Time.unscaledDeltaTime * speed * Vector3.up);

Time.fixedDeltaTimeとかいうそっくりさん

Time.fixedDeltaTimeとは

  • FixedUpdate()が実行される固定間隔

Time.fixedDeltaTimeを使う理由

  • フレームレートに依存せず、物理演算を行うため
  • Update()はフレームレートに依存し、挙動が不安定になる可能性アリ

Time.fixedDeltaTimeの使い方

コード上の扱い方

  • Time.deltaTimeと変わらない
  • 変わるのはUpdate()FixedUpdate()で使用するか
  • ちなみにFixedUpdate()Time.deltaTimeを呼んでも自動でfixedDeltaTimeが返る
float speed = 1.0f;
Vector3 moveVec = Vector3.right * speed * Time.fixedDeltaTime;
transform.Translate(moveVec);

Time.fixedDeltaTimeの変更方法

  • コード上で変更
  • ちなみにTime.deltaTimeを書き換えることはできない
Time.fixedDeltaTime = 1.0f;
  • エディタ上で変更
  • Edit -> ProjectSettings -> Time の Fixed TimeStep を変更

参考リンク

Discussion