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);
}
ディスカッション
コメント一覧
まだ、コメントがありません