Unity 的游戏循环机制

发布于:2025-09-08 ⋅ 阅读:(23) ⋅ 点赞:(0)

Unity 的游戏循环机制

在 Unity 中,游戏的运行是基于的。每一帧都遵循固定的执行顺序:

  1. 处理输入

  2. 执行游戏逻辑 (包括 Update、FixedUpdate 和协程)

  3. 渲染场景

  4. 显示帧

为什么 GameTime.time 在同一帧内不变

  1. GameTime.time 是只读属性

    • 它返回的是当前帧开始时刻的时间戳

    • 在同一帧的所有代码执行过程中,这个值保持不变

    • 只有在下一帧开始时,Unity 引擎才会更新这个值

  2. 代码执行与时间推进的关系

    • 您的代码是在一帧内的「执行游戏逻辑」阶段运行的

    • 在这一阶段,时间还没有「推进」,GameTime.time 保持固定

    • 只有当这一帧完全结束,进入下一帧时,时间才会更新

举例说明Bug

while (GameTime.time - begin <= 0.03f) // 条件永远为 true
{
    var lerp = (GameTime.time - begin) / 0.03f; // 永远是 0/0.03 = 0
    yMouse = Mathf.Lerp(_y_mouse, cameraConfig.y_mouse, lerp); // 永远是起始值
    distanceFromTarget = Mathf.Lerp(...); // 同上
    
    // 没有 yield return,循环继续立即执行下一轮
    // GameTime.time 仍然是 10.0,因为还在同一帧
}
  1. 在第一轮计算:GameTime.time - begin = 0 ≤ 0.03 → 继续

  2. 在第二轮计算:GameTime.time - begin = 0 ≤ 0.03 → 继续

  3. 在第三轮计算:GameTime.time - begin = 0 ≤ 0.03 → 继续

  4. ...无限循环,因为 GameTime.time 不会改变

        为什么这一帧始终无法进入下一帧?

        1、首先我们要知道——Unity是帧更新机制,包括GameTime.time

        2、又因为GameTime.Time需要下一帧进行更新,但GameTime.Time又作为循环条件,这一帧的内容始终在While循环中

使用协程方法yield return new WaitForEndOfFrame的原因

为什么 yield return 能解决这个问题
 

yield return new WaitForEndOfFrame() 的作用是:

  1. 暂停当前协程的执行

  2. 允许当前帧完成(完成渲染等所有操作)

  3. 在下一帧继续执行协程

  4. 此时 GameTime.time 已经更新为下一帧开始的时间

所以,有了 yield return

  • 第1帧:执行一次循环,然后暂停

  • 第2帧:GameTime.time 已更新,再次执行循环

  • 第3帧:GameTime.time 再次更新,可能已经超过 0.03 秒,循环结束

之后的话题:如何理解一帧的内容

这一帧的内容为什么是while循环,还有其他代码属于这一帧的内容吗,如何判断哪些代码属于一个帧内的?

如何判断哪些代码属于同一个帧?

有一个非常简单的判断原则:所有在同一个“游戏逻辑处理阶段”被连续调用的代码,都属于同一帧。

更具体地说,在Unity的主循环中,一帧内按顺序会发生很多事,下图清晰地展示了这一流程以及您的代码是如何被嵌入执行的:


网站公告

今日签到

点亮在社区的每一天
去签到