当前位置: 首页 > ai >正文

Unity 的游戏循环机制

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 = 0yMouse = 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的主循环中,一帧内按顺序会发生很多事,下图清晰地展示了这一流程以及您的代码是如何被嵌入执行的:

http://www.xdnf.cn/news/19848.html

相关文章:

  • 66车载诊断架构 --- 从架构系统角度怎么确保整车DTC的完整性?
  • (二)文件管理-基础命令-pwd命令的使用
  • 计算机视觉(六):腐蚀操作
  • 电脑城老板不会告诉你的装机秘籍:建造者模式让你的代码高配起飞!
  • 基于深度学习的医疗器械生产备案凭证识别技术,实现从图像到结构化数据的智能转化
  • pytorch初级
  • 八、算法设计与分析
  • 新后端漏洞(上)- Python unpickle 造成任意命令执行漏洞
  • 惠普HP Color LaserJet Pro MFP M277dw打印有横条维修案例1
  • RoPE位置编码缩放因子的最优解:频率维度与位置敏感度的精妙权衡
  • SpringBoot项目package报错 PKIX path building failed 终极解决方案:Nexus私服证书导入JDK证书库
  • C++对象构造与析构
  • 2.插值法
  • Spring Boot 实现数据库表变更监听的 Redis 消息队列方案
  • 技术方案之Mysql部署架构
  • uni app 的app 端调用tts 进行文字转语音
  • GDAL 下载安装
  • C题目训练【三连击】
  • Vue3 + Ant Design Vue 实现多选下拉组件(支持分组、搜索与标签省略)
  • Ollama大模型 本地部署+使用教程
  • 【FastDDS】Layer DDS之Domain ( 05-Creating a DomainParticipant)
  • lesson53:CSS五种定位方式全解析:从基础到实战应用
  • GEO服务商推荐:移山科技以划时代高精尖技术引领AI搜索优化新纪元
  • C++ 5
  • 使用 Acme.sh 获取和管理免费 SSL 证书
  • 性能测试-jmeter8-脚本录制
  • 网络通信与协议栈 -- TCP协议与编程
  • [Java]PTA:求最大值
  • 财务文档处理优化:基于本地运行的PDF合并解决方案
  • 入行FPGA选择国企、私企还是外企?