【Unity学习笔记】生命周期

文章目录

  • 脚本的生命周期
    • 初始化
    • 更新顺序
    • 动画更新循环
    • 各类事件
    • 结束阶段
  • 阶段分析
    • 协程返回
  • 总结

官方文档:事件函数的执行顺序


脚本的生命周期

如图:
在这里插入图片描述
脚本的生命周期主要经历以下几个阶段:


初始化

初始化阶段,(包括初始化Awake,OnEnable,然后Editor的Reset被穿插在着初始化过程之间,因此我们可以在脚本里重写Reset方法,这将在编辑器中的game的start之前执行。最后Start),当我们开始游戏的时候,初始化顺序就是Awake,OnEnable,Reset(如果定义了且在编辑器内),Start

Awake:在实例化预制件之后调用此函数。(如果游戏对象在启动期间处于非活动状态,则在激活之后才会调用 Awake。)

OnEnable :(仅在对象处于激活状态时调用)在启用对象后立即调用此函数。在创建 MonoBehaviour
实例时(例如加载关卡或实例化具有脚本组件的游戏对象时)会执行此调用。

Start:仅当启用脚本实例后,才会在第一次帧更新之前调用 Start。

以上时刻都是在第一帧更新之前执行的,一般来说要物体经历Awake,OnEnable之后才会进入Start,例如AB两物体,假设A在B之前执行,执行顺序是A.Awake,A.OnEnable,B.Awake,B.OnEnable,A.Start,B.Start.


更新顺序

在初始化结束后,则进入更新阶段,其中不同更新方式的执行顺序是不同的:

FixedUpdate:该阶段更新时长是固定不变的,大约0.02f一次,主要为了物理系统使用,调用 FixedUpdate 的频度常常超过Update。如果帧率很低,可以每帧调用该函数多次;如果帧率很高,可能在帧之间完全不调用该函数。在 FixedUpdate之后将立即进行所有物理计算和更新。在 FixedUpdate 内应用运动计算时,无需将值乘以 Time.deltaTime。这是因为FixedUpdate 的调用基于可靠的计时器(独立于帧率)。

Update:每帧调用一次 Update。这是用于帧更新的主要函数。Update由于受到帧率影响,因此通常一些游戏控制逻辑会放在这里

LateUpdate:每帧调用一次 LateUpdate__(在 Update__ 完成后)。LateUpdate 开始时,在 Update 中执行的所有计算便已完成。LateUpdate 的常见用途是跟随第三人称摄像机。如果在 Update 内让角色移动和转向,可以在 LateUpdate 中执行所有摄像机移动和旋转计算。这样可以确保角色在摄像机跟踪其位置之前已完全移动。

从上述生命周期图可以看到,更新阶段中三种更新方式的执行顺序应当是依次的,其中第一种方式不受帧率影响,而Update和LateUpdate受帧率影响,且LateUpdate在Update后执行,因此我们可以从执行顺序和执行频率的角度来考虑什么时候使用怎样的更新方式。


动画更新循环

图中灰色区块是动画更新执行的顺序,在物理阶段的FixedUpdate中更新和在游戏主逻辑阶段的Update中更新的流程都是差不多的。

首先执行状态机的固定更新,随后进入状态机的Entry或Exit状态(如果状态机中执行了的话),随后去处理其他动画事件

StateMachineBehaviour (OnStateEnter/OnStateUpdate/OnStateExit):一个层最多可以有 3 个活动状态:当前状态、中断状态和下一个状态。使用一个定义 OnStateEnter、OnStateUpdate 或 OnStateExit 回调的 StateMachineBehaviour 组件为每个活动状态调用此函数。依次针对当前状态、中断状态和下一个状态调用此函数。

可以看到StateMachineBehaviour ,也就是状态机之间的状态切换之后也会给出回调,可以在这些状态切换时定义回调函数。


各类事件

在生命周期中,我们可以看到事件的执行顺序大致都是按照它们的类别处理的:

OnState,OnAnimation等动画事件,最优先

OnTrigger,OnCollistion等物理事件,后于动画事件

OnMouse,OnKey(猜测有,不确信)等输入事件,后于物理事件

OnState,OnAnimation等动画事件,在Update时再次更新

OnRender…等一些场景渲染事件,在LateUpdate后更新

OnDrawGizmos,Gizmos渲染,在场景渲染之后,用于在场景视图中绘制辅助图标以实现可视化。

OnGUI,GUI渲染,在Gizmos渲染之后。每帧调用多次以响应 GUI 事件。首先处理布局和重新绘制事件,然后为每个输入事件处理布局和键盘/鼠标事件。

OnApplicationPause暂停应用,在发生暂停的帧之后调用,但在实际暂停之前发出另一帧。

可以看到整个中间事件处理主要流程就是:先处理动画事件,然后处理物理事件,随后是输入事件,然后动画再更新,随后是一些渲染事件,而GUI的渲染是在一切之后的。


结束阶段

在场景中的所有活动对象上调用以下函数:

OnApplicationQuit:在退出应用程序之前在所有游戏对象上调用此函数。在编辑器中,用户停止播放模式时,调用函数。

OnDisable:行为被禁用或处于非活动状态时,调用此函数。

Object.Destroy 对象存在的最后一帧完成所有帧更新之后,调用此函数(可能应 Object.Destroy 要求或在场景关闭时销毁该对象)。

上述事件例如OnDisable,Destroy等都是在游戏中可以执行的,而OnApplicationQuit方法只能在执行退出时调用。整个退出过程就是OnApplicationQuit,OnDisable,Destroy 。而执行退出的方法应当是Application.Quit。


阶段分析

上述过程大致可分为:初始化阶段,物理阶段,输入检测阶段,游戏逻辑阶段,渲染阶段,结束阶段。

初始化阶段在游戏开始时进行一次,而结束阶段也只会在游戏结束时进行一次,其余阶段在每帧都会顺序地循环进行一次。

其中内部动画更新穿插在物理阶段的FixedUpdate之后,物理事件之前,以及游戏逻辑阶段的Update之后,LaterUpdate之间。输入检测阶段在物理阶段和游戏逻辑阶段之间,即FixedUpdate结束,Update之前。渲染阶段在游戏逻辑阶段之后,处于整个帧的最后,当渲染阶段结束意味着该帧结束。

协程返回

不难发现,实际上协程的返回时刻可以视为一些阶段起始点和结束点的标志。例如yield WaitForFixedUpdate标志FixedUpdate结束的时刻,yield null和其他一些随后的返回则在Update之后,yield WaitForEndOfFrame则代表了每帧结束的时刻。(中间英文翻译:一些本来应该返回的协程如果中断了,在之后恢复执行也要在Update执行yield,可能翻译有误)


总结

整个生命周期重要时刻的执行顺序:

  • 初始化阶段
  • Awake ,OnEnable ,Restart(编辑器),Start
  • 物理阶段
  • OnFixedUpdate
  • (内部动画执行)
  • yield return WaitForFixedUpdate
  • 输入阶段
  • OnMouseXXX
  • 游戏逻辑阶段
  • Update
  • yield return null
  • yield return WaitForSeconds
  • yield return WWW
  • yield return StartCoroutine
  • (内部动画执行)
  • LaterUpdate
  • 渲染阶段
  • SceneRender场景渲染
  • Gizmos渲染
  • GUIRender(GUI渲染最后)
  • yield return WaitForEndOfFrame 标志帧的结束
  • (暂停,帧结束回到OnFixedUpdate或者结束游戏)
  • 结束阶段
  • OnApplicationQuit,OnDisable,Destory

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/57744.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVM之内存结构

1.程序计数器 定义:程序计数器(Program Counter Register)是JVM中一块较小的内存空间。解释器在解释JVM指令为机器码以供CPU执行时,会去程序计数器当中找到jvm指令的执行地址。 作用:记住下一条jvm指令的执行地址 特…

机器学习笔记 - 使用 YOLOv5、O​​penCV、Python 和 C++ 检测物体

一、YOLO v5简述 YOLO v5虽然已经不是最先进的对象检测器,但是YOLOv5 使用了一个简单的卷积神经网络 CNN架构(相对YOLO v8来讲,不过v8精度是更高了一些),更易理解。这里主要介绍如何轻松使用 YOLO v5来识别图像中的对象。将使用 OpenCV、Python 和 C++ 来加载和调用我们的…

CPU缓存那些事儿

CPU缓存那些事儿 CPU高速缓存集成于CPU的内部,其是CPU可以高效运行的成分之一,本文围绕下面三个话题来讲解CPU缓存的作用: 为什么需要高速缓存?高速缓存的内部结构是怎样的?如何利用好cache,优化代码执行…

Go学习第三天

map的三种声明定义方式 声明map后,一定要make开辟空间,否则会报越界且不能使用 package mainimport "fmt"func main() {// 第一种声明方式// 声明myMap1是一种map类型 key是string value是stringvar myMap1 map[string]string// 判断一下map在…

小研究 - 微服务系统服务依赖发现技术综述(二)

微服务架构得到了广泛的部署与应用, 提升了软件系统开发的效率, 降低了系统更新与维护的成本, 提高了系统的可扩展性. 但微服务变更频繁、异构融合等特点使得微服务故障频发、其故障传播快且影响大, 同时微服务间复杂的调用依赖关系或逻辑依赖关系又使得其故障难以被及时、准确…

木马病毒怎么回事?带你深度分析了解木马病毒!

一、病毒简介 SHA256:3110f00c1c48bbba24931042657a21c55e9a07d2ef315c2eae0a422234623194 MD5:ae986dd436082fb9a7fec397c8b6e717 SHA1:31a0168eb814b0d0753f88f6a766c04512b6ef03 二、行为分析 老套路,火绒剑监控: 这边可以看见创建了一个exe&#x…

性能压力测试的重要性与实施方法

性能压力测试是在软件开发过程中评估系统在不同负载条件下的表现和稳定性的关键步骤。这种测试是为了确定系统在正常和峰值负载下的性能表现,以验证系统是否能够满足用户需求,同时发现潜在的性能问题并加以解决。 首先,性能压力测试对于确保系…

《皮囊》阅读笔记

《皮囊》阅读笔记 2023年8月2号在杭州小屋读完,该书共收录14篇散文,内容大致分为两部分:前半部分讲述作者的阿太(外婆的母亲)、母亲、父亲关于生活哲学、房子、疾病与信仰的故事,后半部分讲述生活在小镇的张…

【BASH】回顾与知识点梳理(一)

【BASH】回顾与知识点梳理 一 前言一. 认识与学习 BASH1.1 硬件、核心与 Shell1.2 为何要学文字接口的 shell?1.3 系统的合法 shell 与 /etc/shells 功能1.4 Bash shell 的功能1.5 查询指令是否为 Bash shell 的内建命令: type1.6 指令的下达与快速编辑按…

122.买卖股票的最佳时机2

一、题目 122. 买卖股票的最佳时机 II - 力扣&#xff08;LeetCode&#xff09; 二、代码 class Solution { public:int maxProfit(vector<int>& prices) {int n prices.size();vector<vector<int>>dp(n,vector<int>(2,0));//0表示第i天不持有股…

python算法指南程序员经典,python算法教程pdf百度云

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;你也能看懂的python算法书 pdf&#xff0c;python算法教程这本书怎么样&#xff0c;现在让我们一起来看看吧&#xff01; 给大家带来的一篇关于算法相关的电子书资源&#xff0c;介绍了关于算法、详解、算法基础方面的内…

最细致讲解yolov8模型推理完整代码--(前处理,后处理)

研究yolov8时&#xff0c;一直苦寻不到Yolov8完整的模型推理代码演示&#xff0c;大部分人都是基于Yolo已经封装好的函数调用&#xff0c;这个网上教程很多&#xff0c;本文就不赘述这方面的内容了&#xff0c;接下来将细致全面的讲解yolov8模型推理代码&#xff0c;也就是yolo…

cloudstack远程调试

前置条件&#xff1a;服务器安装好cloudstack的management、agent; 1、managemeng、agent启动服务文件 packaging/systemd cloudstack-agent.default # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTIC…

ES6之Promise、Class类与模块化(Modules)

目录 PromiseClass类extendssuper Modules 模块系统export default 和对应importexport 和 import Promise Promise 是 ES6 引入的一种用于处理异步操作的对象。 它解决了传统回调函数&#xff08;callback&#xff09;模式中容易出现的回调地狱和代码可读性差的问题。 Promis…

数学学习——最优化问题引入、凸集、凸函数、凸优化、梯度、Jacobi矩阵、Hessian矩阵

文章目录 最优化问题引入凸集凸函数凸优化梯度Jacobi矩阵Hessian矩阵 最优化问题引入 例如&#xff1a;有一根绳子&#xff0c;长度一定的情况下&#xff0c;需要如何围成一个面积最大的图像&#xff1f;这就是一个最优化的问题。就是我们高中数学中最常见的最值问题。 最优化…

小白到运维工程师自学之路 第六十五集 (docker-compose)

一、概述 Docker Compose 的前身是 Fig&#xff0c;它是一个定义及运行多个 Docker 容器的工具。可以使用YAML文件来配置应用程序的服务。然后&#xff0c;使用单个命令&#xff0c;您可以创建并启动配置中的所有服务。Docker Compose 会通过解析容器间的依赖关系&#xff08;…

vmware网络配置

效果&#xff1a; 虚拟机和物理机网络互通&#xff1b; 虚拟机可以上外网 环境&#xff1a; vmware version 17.0.0 Centos 7.9 配置 1&#xff0c;vmware 菜单 - 编辑 - Virtual Network Edit 2&#xff0c; 选择VMnet8 VMnet information:NAT&#xff1b; 勾选2个…

ansible控制主机和受控主机之间免密及提权案例

目录 案例描述 环境准备 案例一--免密远程控制主机 效果展示&#xff1a; 解决方案 1.添加主机 2.通过ssh-key生成密钥对 3.生成ssh-copy-id 4.验证 案例二-----免密普通用户提权 效果展示 解决方案 1.使用普通用户&#xff0c;与案例一 一样&#xff0c;进行发送密钥…

【力扣每日一题】2023.8.2 翻转卡片游戏

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 这道题不是什么翻转卡片游戏&#xff0c;这就是纯纯的文字游戏&#xff0c;要是能看懂题目那就是非常简单&#xff0c;接下来我就给大家分…

低代码已经发展到什么水平了?

在数字化转型的浪潮下&#xff0c;企业和组织迫切需要更快速、高效的应用开发方式来满足日益复杂的业务需求。而低代码开发作为一种创新的开发方式&#xff0c;正在引领着应用开发的新潮流。低代码开发允许开发者以可视化的方式快速构建应用&#xff0c;减少了繁琐的代码编写&a…