【Unity学习笔记】生命周期

news2024/12/23 18:43:34

文章目录

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

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


脚本的生命周期

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


初始化

初始化阶段,(包括初始化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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RISC-V 指令集介绍

1. 背景介绍 指令集从本质上可以分为复杂指令集(Complex Instruction Set Computer,CISC)和精简指令集(Reduced Instruction Set Computer,RISC)两种。复杂指令集的特点是能够在一条指令内完成很多事情。 指…

1400*A. Factory

Examples input 1 5 output No input 3 6 output Yes 题意: a 和 m,a 不断加 a%m ,如果 a 有一次能够被 m 整除,则打印 Yes,如果一直循环永远不可能被 m 整除,则打印 No 解析: 可以观…

BUU CODE REVIEW 1

BUU CODE REVIEW 1 考点&#xff1a;PHP变量引用 源码直接给了 <?phphighlight_file(__FILE__);class BUU {public $correct "";public $input "";public function __destruct() {try {$this->correct base64_encode(uniqid());if($this->c…

数据库中RIGHT_TYPE=3和RIGHT_TYPE=“3“的区别

G_USERINFO表归档条件SQL错误&#xff0c; RIGHT_RIGHT_TYPE3应改为RIGHT_TYPE"3"&#xff0c; 该字段为字符类型 在Oracle中&#xff0c;类型&#xff08;type&#xff09;通常是指数据库中的表、视图、索引、存储过程、函数等对象的的数据类型或结构。在比较类型&a…

解决:h5的<video>在移动端浏览器无法自动播放

并不是所有的移动端浏览器都无法自动播放&#xff0c;下载谷歌、火狐、edge等都可以正常播放&#xff0c;目前发现夸克浏览器无法自动播放。即autoplay属性失效。 <video autoplay"autoplay"></video> 可能移动端有移动端的策略&#xff0c;但解决夸克…

C++标识符的作用域与可见性

标识符是一个由程序员定义的名称&#xff0c;为标识区别变量、函数和数据类型等&#xff0c;代表程序的某些元素&#xff0c;变量名就是标识符的一个展现。 作用域讨论的是标识符的有效范围&#xff0c;可见性讨论的是标识符是否可以被引用。在一个函数中声明的变量就只能在这个…

vue中使用代码编辑器 vue2-ace-editor

npm install --save-dev vue2-ace-editor// 全局引入 main.jsimport Editor from vue2-ace-editor; Vue.use(Editor)//组件中引入import Editor from vue2-ace-editor; components: {Editor, },<template><div class"codeEditBox"><editorv-model&qu…

2353. 设计食物评分系统;1895. 最大的幻方;842. 将数组拆分成斐波那契序列

2353. 设计食物评分系统 核心思想&#xff1a;首先明确我们有哪些功能&#xff0c;首先是修改某种食物分数的功能&#xff0c;然后第二点是能够每次弹出分数高字典序小的食物名字。由这两个我们想到了a 食物[分数],b 烹饪方式[分数&#xff0c;食物名字] 然后有一点经验的感…

小程序基础笔记

一、小程序与普通网页开发的区别 1、运行环境不同 网页运行在浏览器环境中小程序运行在微信环境中 2、API 不同 由于运行环境的不同&#xff0c;所以小程序中&#xff0c;无法调用 DOM 和 BOM 的 API。但是&#xff0c;小程序中可以调用微信环境提供的各种 API&#xff0c;例如…

初识低代码开发平台

2019年开始&#xff0c;低代码爆火&#xff0c;有人唱衰有人捧&#xff0c;反对的人认为对于那些真正的程序员来说&#xff0c;简直就是毒瘤&#xff0c;只是炒作概念而已&#xff0c;等尘埃落地&#xff0c;肯定一地鸡毛。 但是对于那些缺技术、缺人才&#xff0c;又需要数字…

ERROR:No tf data. Actual error: Fixed Frame [map] does not exist 解决办法

问题场景&#xff1a; 使用rviz时&#xff0c;出现warning&#xff0c;并且地图无法加载&#xff0c;如下所示&#xff1a; 原因分析&#xff1a; 之所以地图无法加载出来&#xff0c;其主要原因是tf树中没有world坐标系&#xff0c;解决方法就是让rviz知道world坐标系在哪…

短视频平台视频怎么去掉水印?

短视频怎么去水印&#xff0c;困扰很多人&#xff0c;例如&#xff0c;有些logo水印&#xff0c;动态水印等等&#xff0c;分享操作经验&#xff1a; 抖音作为中国最受欢迎的社交娱乐应用程序之一&#xff0c;已成为许多人日常生活中不可或缺的一部分。在使用抖音过程中&#x…

《TCP IP网络编程》第十四章

第 14 章 多播与广播 14.1 多播 多播&#xff08;Multicast&#xff09;方式的数据传输是基于 UDP 完成的。因此 &#xff0c;与 UDP 服务器端/客户端的实现方式非常接近。区别在于&#xff0c;UDP 数据传输以单一目标进行&#xff0c;而多播数据同时传递到加入&#xff08;注…

【奥比中光Gemini 2L快速上门】

奥比中光Gemini 2L快速上手 目录 奥比中光Gemini 2L快速上手[TOC](目录) 一、下载配置环境1.1 官网下载SDK1.2 配置环境 二、测试2.1 在bin中运行示例2.2 配置cmake 三、CMAKE3.1 CmakeLists.txt中各设置的意义 一、下载配置环境 1.1 官网下载SDK 进入官网&#xff0c;下载名…

maven的下载安装与配置环境变量!!!(全网最详细)

1.maven 官方网站&#xff0c;http://maven.apache.org 2.去官网下载。 3.选择你自己的解压路径&#xff08;D:\maven【我的挤压路径】&#xff09; 4.配置jdk环境变量&#xff08;不会的小伙伴可以看我以前的博客&#xff09; jdk 1.8 安装配置环境变量_明天更新的博客-CSD…

详细介绍Webpack5中的Plugin

Plugin的作用 插件Plugin可以扩展webpack&#xff0c;加入自定义的构建行为&#xff0c;使 webpack 可以执行更广泛的任务&#xff0c;拥有更强的构建能力。 Plugin的工作原理 webpack就像一条生产线&#xff0c;要经过一系列处理流程后才能将源文件转换成输出结果。 这条生…

Linux系统下MySQL读写分离

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、基于Amoeba读写分离 1.基于程序代码内部实现 2.基于中间代理层实现 三、操作步骤 1.在主机Amoeba上安装java环境 2.安装并配置Amoeba 3.配置Amoeba读写分离…

matlab RRR机械臂 简略代码

RRR机器人&#xff01;启动&#xff01; gazebo在arm mac上似乎难以运行&#xff0c;退而选择Matlab&#xff0c;完成老师第一个作业&#xff0c;现学现卖&#xff0c;权当记录作业过程&#xff0c;有不足之处&#xff0c;多多指教。 作业&#xff01;启动&#xff01; RRR机…

WAF绕过-信息收集篇

WAF绕过主要集中在信息收集&#xff0c;漏洞发现&#xff0c;漏洞利用&#xff0c;权限控制四个阶段。 1、什么是WAF&#xff1f; Web Application Firewall&#xff08;web应用防火墙&#xff09;&#xff0c;一种公认的说法是“web应用防火墙通过执行一系列针对HTTP/HTTPS的安…

有效的随机圆检测

文章目录 0、 摘要&#xff1a;一、 Base Idea二、 Determining Possible Circle2.1 判别条件2.2 圆的判别 三、Determining True Circles四、The Proposed RCD五、改进六、参考在这里插入图片描述 有效的随机圆检测 0、 摘要&#xff1a; 参考的文章提出了一种有效的不基于霍…