Unity移動処理の統一化:Time.deltaTimeとフレームレート固定の比較

1. はじめに:Updateメソッドとは?

UnityのUpdate()メソッドは毎フレーム呼ばれるメソッドです。

このため、PCの性能によりフレーム数が異なると、処理の結果も異なってしまいます。


2. 問題点:フレームレートに依存した移動

void Update()
{
    transform.Translate(Vector3.forward * 5f);
}
  • フレームごとに一定量(5)進む
  • 高FPSのPC → より多く移動(早く動く)
  • 低FPSのPC → あまり移動しない(遅く動く)
  • 環境依存で不公平な挙動になる

3. 解決法:Time.deltaTimeを掛ける

void Update()
{
    float speed = 5f;
    transform.Translate(Vector3.forward * speed * Time.deltaTime);
}
  • Time.deltaTime:前のフレームからの経過秒数
  • 実時間ベースの移動(1秒間でspeed分進む)
  • どのFPSでも同じ移動距離を実現

4. もうひとつの解決策:フレームレート固定(Application.targetFrameRate)

void Awake()
{
    Application.targetFrameRate = 60;
}
  • フレームレートを60FPSに制限
  • すべての端末で60回/秒のUpdate()実行を目指す
  • しかし…

5. フレームレート固定 vs Time.deltaTime

項目フレームレート固定のみTime.deltaTime 使用
実行時間依存×(FPSが落ちると影響あり)○(常に時間で制御)
端末ごとの公平性△(制限しても保証できない)◎(端末に依らず一定速度)
動作の滑らかさ△(制限FPSに依存)◎(高FPSでも滑らか)
バッテリー節約(モバイル)○(負荷を抑えられる)△(動きは滑らかだが負荷は高くなる場合あり)
推奨度△(一部用途のみ)◎(標準的な実装手法)

6. 結論:基本は Time.deltaTimeを使うべき

  • Application.targetFrameRate はあくまで補助的な手段
  • 動作の正確性・滑らかさを担保するためには、Time.deltaTime を使った時間ベース制御が基本

7. 補足:FixedUpdate() はまた別の文脈

  • 物理演算は FixedUpdate() で制御される
  • FixedUpdate() は 一定時間間隔(例:0.02秒)で呼ばれる
  • Rigidbodyの移動などは deltaTime ではなく Time.fixedDeltaTime を使う
void FixedUpdate()
{
    rb.MovePosition(rb.position + Vector3.forward * speed * Time.fixedDeltaTime);
}

Time.deltaTime

Posted by hidepon