- 用户指南
- 资源商店 (Asset Store)
- 资源服务器 (Asset Server)(仅限团队许可证)
- 缓存服务器(仅限团队许可证)
- 幕后场景
- 创建游戏
- 运行时实例化预设 (Prefabs)
- 变换 (Transforms)
- 物理
- 添加随机的游戏元素
- 粒子系统(Particle Systems)
- Mecanim 动画系统
- 旧动画系统
- 导航网格 (Navmesh) 和寻路 (Pathfinding)(仅限专业版 (Pro))
- Sound (音频侦听器)
- 游戏界面元素
- 多玩家联网游戏
- iOS 开发入门
- Android 开发入门
- Blackberry 10 开发入门
- Metro:入门指南
- 本地客户端开发入门
- FAQ
- Advanced
- Vector Cookbook
- 资源包(仅限专业版)
- Graphics Features
- 资源数据库 (AssetDatabase)
- 构建播放器管道
- 分析器(仅限专业版)
- 光照贴图快速入门
- 遮挡剔除(仅限专业版)
- 相机使用技巧
- 运行时加载资源
- 通过脚本修改源资源
- 用程序生成网格几何体
- 富文本
- 在 Unity 工程 (Project) 中使用 Mono DLL
- 事件函数的执行顺序
- 移动优化实用指南
- Unity XCode 工程结构
- 优化图形性能
- 减少文件大小
- 理解自动内存管理
- 平台依赖编译
- 泛型函数
- 调试
- 插件(专业版/移动版特有功能)
- 文本场景文件格式(仅限专业版)
- 流媒体资源
- 启动时运行编辑器脚本代码
- 网络模拟
- VisualStudio C 集成
- 分析
- 检查更新
- 安装多版本 Unity
- 故障排除
- Unity 中的阴影
- Unity 中的 IME
- 对集成显卡进行优化
- 网络播放器 (Web Player) 部署
- 使用网络播放器中的信任链系统
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
事件函数的执行顺序
Unity 脚本中有许多按预设顺序以脚本身份运行的事件函数。其执行顺序如下:
加载第一个场景
启动场景时调用这些函数(为场景中的每个对象调用一次)。
- Awake: 始终在调用任何 Start 函数之前和实例化预设之后调用此函数。(如果游戏对象 (GameObject) 在启动期间处于非活动状态,则直到其处于活动状态时或调用添加至其本身的任何脚本中的函数时,再调用 Awake 函数。)
- OnEnable: (仅当对象 (Object) 处于活动状态时调用此函数):程序会在启用该对象后立即调用此函数。上述现象会在创建了实例化的 MonoBehaviour 后发生,例如加载了级别或对含脚本组件的游戏对象 (GameObject) 进行实例化后。
第一帧更新之前
- Start: 只要启用脚本实例,即可在更新第一帧之前调用 Start 函数。
插值帧
- OnApplicationPause: 程序检测到暂停时,会在帧的结尾处调用此函数,这在常规帧更新期间很有效。调用 OnApplicationPause后,程序将运行另一帧来显示提示暂停状态的图形。
更新顺序
有几个不同的事件有助于追踪游戏逻辑与交互、动画、相机位置等内容。常用的方法是运行Update() 函数中的大部分任务,但也可使用其他函数。.
- FixedUpdate: 通常,FixedUpdate() 的调用频率高于 Update()。如果帧速率较低,则可在一帧中多次调用此函数,如果帧速率较高,则可能完全无法在帧间调用此函数。程序调用 FixedUpdate() 后将立即执行所有物理计算和更新。在 FixedUpdate() 中应用移动计算时,无需将您的值与 Time.deltaTime 相乘。这是因为,程序是在可靠的计时器上调用 FixedUpdate(),与帧速率无关。
- Update: 在每帧上调用一次 Update() 函数。它是用于帧更新的主要 workhorse 函数。
- LateUpdate: 完成 Update() 调用后,在每帧上调用 LateUpdate()。Update() 中执行的所有计算都将在 LateUpdate() 开始之前结束。LateUpdate() 的常规使用记录由第三人称相机跟踪。如果在 Update() 中移动和旋转角色,则可在 LateUpdate() 中计算所有相机移动和旋转。这将确保在相机跟踪其位置之前完整移动该角色。
渲染
- OnPreCull: 在相机剔除场景之前调用此函数。相机可见的对象取决于剔除。OnPreCull 函数调用发生在剔除之前。
- OnBecameVisible/OnBecameInvisible: 在对象对于相机可见/不可见时调用此函数。
- OnWillRenderObject: 如果对象可见,则为每个相机调用一次此函数。
- OnPreRender: 在相机开始渲染场景之前调用此函数。
- OnRenderObject: 在完成所有常规场景渲染后调用此函数。此时,可使用 GL 类或 Graphics.DrawMeshNow 绘制自定义几何图形。
- OnPostRender: 在相机完成场景渲染后调用此函数。
- OnRenderImage(仅限专业版): 在完成场景渲染后调用此函数,以便对屏幕图像进行后处理。
- OnGUI: 在每帧上多次调用此函数,以响应 GUI 事件。程序首先将处理 Layout 和 Repaint 事件,然后再处理每个输入事件的 Layout 和 keyboard/鼠标事件。
- OnDrawGizmos 用于在场景视图中绘制小图示 (Gizmos),以实现可视化目的。
协同程序
正常的协同程序更新是在返回 Update 函数之后运行。协同程序是可自行停止运行 (yield),直到给定的 YieldInstruction 结束再继续运行的函数。 协同程序 (Coroutines) 的不同用途:
- yield; 在下一帧上调用所有 Update 函数后,协同程序将继续运行。
- yield WaitForSeconds(2); 在指定的时间延迟之后,为此帧调用所有 Update 函数之后继续运行
- yield WaitForFixedUpdate(); 在所有脚本上调用所有 FixedUpdate 后继续运行
- yield WWW 完成 WWW 下载后继续运行。
- yield StartCoroutine(MyFunc); 连接协同程序,并等待 MyFunc coroutine 首先结束。
对象 (Object) 被销毁时
- OnDestroy: 完成所有帧更新后,在当前对象的最后一帧上调用此函数(可能为响应 Object.Destroy 或在关闭场景时销毁此对象)。
退出时
程序将在场景的所有活动对象上调用这些函数:
- OnApplicationQuit: 在退出应用程序之前,程序会在所有游戏对象上调用此函数。在编辑器中,用户停止播放模式时,程序将调用此函数。在网页播放器中,此函数会在网页视图关闭时调用。
- OnDisable: 此函数会在行为被禁用或不活动时调用。
综上所述,任何给定脚本的执行顺序为:
- 调用所有 Awake
- 调用所有 Start
- 同时进行(朝向可变增量时间)
- 所有 FixedUpdate 函数
- 物理模拟
- OnEnter/Exit/Stay 触发函数
- OnEnter/Exit/Stay 碰撞函数
- 刚体插值应用 transform.position 和旋转
- OnMouseDown/OnMouseUp 等事件
- 所有 Update 函数
- 将动画优化为高级、混合并应用动画,以进行变换
- 所有 LateUpdate 函数
- 渲染
提示
- 协同程序在所有 Update 函数结束后运行。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论