什么是 Time.deltaTime,它是如何工作的?
Source: Dev.to

什么是 Time.deltaTime?
要理解 Time.deltaTime,首先需要了解 Update() 方法。
Update() 是 Unity 的主玩家循环方法,会在 每一帧 调用一次。放在 Update() 中的任何代码都会在每帧执行——通常用于角色移动的代码。
如果你写的代码是在按钮被按下时让角色移动 1 单位,那么在不同帧率的机器上角色移动的距离会不同。机器越快,Update() 每秒调用的次数越多,角色移动的距离就越远。
真正的问题:FPS
根本原因是 每秒帧数(FPS)。
- 更高的 FPS →
Update()调用更频繁 → 每秒移动次数更多 → 移动更快。 - 更低的 FPS →
Update()调用更少 → 每秒移动次数更少 → 移动更慢。
Time.deltaTime 通过提供 自上一帧以来经过的时间(秒) 来解决这个问题。将移动乘以 Time.deltaTime 可以把每帧的移动量转换为每秒的移动量,从而在不同硬件上保持一致的行为。
它是如何工作的?
示例 1:不使用 Time.deltaTime
| 机器 | FPS | 每帧移动量 | 每秒移动量 |
|---|---|---|---|
| 低速 PC | 60 | 1 单位 | 60 × 1 = 60 单位 |
| 高速 PC | 120 | 1 单位 | 120 × 1 = 120 单位 |
结果:更快的机器让角色移动得更快 —— 不理想。
示例 2:使用 Time.deltaTime
| 机器 | FPS | Time.deltaTime(秒) | 每帧移动量(1 × deltaTime) | 1 秒后的移动量 |
|---|---|---|---|---|
| 低速 PC | 60 | ≈ 0.01666 | 0.01666 单位 | 0.01666 × 60 = 1 单位 |
| 高速 PC | 120 | ≈ 0.00833 | 0.00833 单位 | 0.00833 × 120 = 1 单位 |
结果:无论 FPS 如何,角色移动保持一致。
如何使用
只需在 Update() 中将任何每帧值(例如速度)乘以 Time.deltaTime:
// 以每秒 1 单位的速度向前移动
transform.Translate(Vector3.forward * 1f * Time.deltaTime);
// 或者使用自定义的速度变量
transform.position += movementSpeed * Time.deltaTime * transform.forward;
关键要点
在 Update() 中执行应当与帧率无关的操作时,务必使用 Time.deltaTime。除非你刻意希望行为随机器性能变化,否则不要在没有它的情况下进行基于时间的移动。