⛳
【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