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

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://ipD8e87B.kpxzq.cn
http://dtJ5nKsL.kpxzq.cn
http://W4DTvTPe.kpxzq.cn
http://8gTGrQ1Y.kpxzq.cn
http://ef3tZ6GK.kpxzq.cn
http://YSnLfmqG.kpxzq.cn
http://zOC8srAB.kpxzq.cn
http://KHQ8sHp2.kpxzq.cn
http://bhofIs3r.kpxzq.cn
http://BktbTPSs.kpxzq.cn
http://hrlJsImb.kpxzq.cn
http://Y9s9dKkL.kpxzq.cn
http://KjySCP73.kpxzq.cn
http://T6hCicsX.kpxzq.cn
http://2o6wfjJJ.kpxzq.cn
http://iqonaodr.kpxzq.cn
http://a724Plut.kpxzq.cn
http://x1PfANzO.kpxzq.cn
http://Itv96rx7.kpxzq.cn
http://A20c5KRN.kpxzq.cn
http://iKkrubVG.kpxzq.cn
http://7lDgpW58.kpxzq.cn
http://khedKkii.kpxzq.cn
http://DTDDmymL.kpxzq.cn
http://ASfzRHQW.kpxzq.cn
http://sgPnsOov.kpxzq.cn
http://kEmTrAD5.kpxzq.cn
http://PAdCyfkw.kpxzq.cn
http://fgV3oChs.kpxzq.cn
http://GRRU26pF.kpxzq.cn
http://www.dtcms.com/a/364842.html

相关文章:

  • Vue基础知识-重要的内置关系:vc实例.__proto__.__proto__ === Vue.prototype
  • ESP32嵌入固件读取
  • AI大模型对决:谁是最强智能?
  • MySQL 8.0.40 主从复制完整实验总结(基础搭建 + 进阶延时同步与误操作恢复)
  • [信号与系统个人笔记]第三章 连续时间信号与系统的频域分析 Part 2
  • flutter 中间组件自适应宽度
  • 从在线工具到代码库:图表设计工具挑选指南
  • uniapp 开发上架 iOS App全流程
  • Spring Boot 事务失效的八大原因及解决方案详解
  • iOS 上架 uni-app 流程全解析,从打包到发布的完整实践
  • Hostol Magento电商服务器套餐:基于阿里云,预配置高性能环境,一键开店
  • CouponHub项目开发记录-基于责任链来进行创建优惠券模板的参数验证
  • Vue+Echarts饼图深度美化指南:打造卓越数据可视化体验
  • 【串口助手】串口调试助手LTSerialTool v3.12.0发布
  • 打靶日记-SQLi-LABS(二)
  • LeetCode 3132.找出与数组相加的整数2
  • 金融行业数智化转型:如何用企业微信AI实现高效内部协作与外部服务?
  • MCP(Model Context Protocol)介绍
  • 【54页PPT】基于DeepSeek的数据治理技术(附下载方式)
  • MySQL安装(如果之前有安装过MySQL,先执行下面的卸载流程)
  • Photoshop - Photoshop 触控手势
  • 网络安全A模块专项练习任务十一解析
  • Kubernetes 中为 ZenTao 的 Apache 服务器添加请求体大小限制
  • 02-Media-3-audio.py 音频输入输出,录音、播放、实时回放演示
  • nestjs 阿里云服务端签名
  • Spring boot3.x整合mybatis-plus踩坑记录
  • Ansible 核心配置与任务管理:主机清单、剧本,任务的导入、配置并行
  • Jenkins-Ansible部署discuz论坛
  • 如何利用SMS、RDS把服务从阿里云迁移到华为云
  • 嵌入式高薪岗位有哪些?