⛳
【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.deltaTimeはTime.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