什么是 Time.deltaTime,它是如何工作的?

发布: (2025年12月10日 GMT+8 22:42)
3 min read
原文: Dev.to

Source: Dev.to

关于 Time.deltaTime 的封面图片

什么是 Time.deltaTime?

要理解 Time.deltaTime,首先需要了解 Update() 方法。
Update() 是 Unity 的主玩家循环方法,会在 每一帧 调用一次。放在 Update() 中的任何代码都会在每帧执行——通常用于角色移动的代码。

如果你写的代码是在按钮被按下时让角色移动 1 单位,那么在不同帧率的机器上角色移动的距离会不同。机器越快,Update() 每秒调用的次数越多,角色移动的距离就越远。

真正的问题:FPS

根本原因是 每秒帧数(FPS)

  • 更高的 FPSUpdate() 调用更频繁 → 每秒移动次数更多 → 移动更快。
  • 更低的 FPSUpdate() 调用更少 → 每秒移动次数更少 → 移动更慢。

Time.deltaTime 通过提供 自上一帧以来经过的时间(秒) 来解决这个问题。将移动乘以 Time.deltaTime 可以把每帧的移动量转换为每秒的移动量,从而在不同硬件上保持一致的行为。

它是如何工作的?

示例 1:不使用 Time.deltaTime

机器FPS每帧移动量每秒移动量
低速 PC601 单位60 × 1 = 60 单位
高速 PC1201 单位120 × 1 = 120 单位

结果:更快的机器让角色移动得更快 —— 不理想

示例 2:使用 Time.deltaTime

机器FPSTime.deltaTime(秒)每帧移动量(1 × deltaTime1 秒后的移动量
低速 PC60≈ 0.016660.01666 单位0.01666 × 60 = 1 单位
高速 PC120≈ 0.008330.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。除非你刻意希望行为随机器性能变化,否则不要在没有它的情况下进行基于时间的移动。

Back to Blog

相关文章

阅读更多 »

Unity 迷你足球

1. Maydon poli Plane - 层级 → 右键单击 → 3D Object → Plane - 检查器设置:- Name: Ground - Position: X = 0, Y = 0, Z = 0 - Scale: X = 2, Y = 1, …