【Unity学习笔记】生命周期

这篇具有很好参考价值的文章主要介绍了【Unity学习笔记】生命周期。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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


脚本的生命周期

如图:
【Unity学习笔记】生命周期,Unity学习笔记,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,可能翻译有误)


总结

整个生命周期重要时刻的执行顺序:文章来源地址https://www.toymoban.com/news/detail-621397.html

  • 初始化阶段
  • 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

到了这里,关于【Unity学习笔记】生命周期的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity 脚本的生命周期

    Unity 脚本的生命周期有哪些?什么时机会触发/执行?什么时候用? 手册 Unity 手册地址 生命周期 初始化 方法说明: Awake:当物体载入时立即调用一次,在 Start 函数之前调用。 OnEnable:在脚本对象启用时调用。 Start:仅当启用脚本实例时,才会在第一帧调用。 Reset:编辑器下

    2024年04月09日
    浏览(70)
  • unity生命周期简单叙述

    1Awake(),2 OnEnable(), 3 Start(), 4 FixedUpdate(), 5 Update(), 6 LateUpdate(), 7 OnGUI(), 8 OnDisable(), 9 OnDestroy(). 特殊一点的方法Reset() Reset 方法是在编辑器中调用的,并且仅在以下情况下执行: 脚本组件被添加到 GameObject 上: 当你将一个脚本组件添加到一个 GameObject 上时,如果该脚本包含 Re

    2024年02月04日
    浏览(40)
  • 【Unity】一文了解生命周期

    又新开一个坑,这个系列主要是记录Unity的干货,就不像之前那几个有点口水话了233 当然我会改正 时隔半个月 经历了开学 换教室等等一系列杂七杂八的事情也算步入正轨了~ 没杂七杂八的介绍什么,不水字数,直接开干!(暴论) 编写顺序会严格按照真实的生命周期顺序

    2023年04月22日
    浏览(34)
  • 【Unity函数执行顺序(Unity脚本生命周期函数)】

    温故而知新,下面我将介绍Unity入门需要了解的常用生命周期函数 生命周期函数就是该脚本对象依附的GameObject对象从出生到消亡整个生命周期中 会通过反射自动调用的一些特殊函数。 下面是对各个函数解锁 a.调用情况: 1.在加载场景时初始化包含脚本激活状态的GameObject时。

    2023年04月23日
    浏览(51)
  • Unity之组件的生命周期

    PS:第二天,依旧在摸鱼学unity 我本身是由Web后端转到了游戏后端,最近因为工作原因在学ET框架。学到了 ECS 编程模式开发(E —— Entity,C —— Component , S —— System)实体、组件、逻辑开发。 我是这么理解的:组件是挂载到实体上的,组件中记录了实体所需要的数据,然

    2024年02月02日
    浏览(38)
  • Unity MonoBehaviour事件函数的生命周期

    Unity运行时候的默认的几个函数的执行顺序: 首先是Awake,OnEnable,Start等,后面是FixUpdate Update 最后是OnDisable、OnDestroy

    2024年02月10日
    浏览(44)
  • unity的函数生命周期以及静态生成方法

    前段时间毕业了,到处跑着玩,玩傻了之后入职了又摸了一个多月鱼~收收心了,近期的学习计划是下半年入门图形学,九月中旬把线性代数学完,所以unity和游戏开发的文章还是很少更新了,等后期学习图形学再慢慢更新和学习记录吧,中间工作中遇到的一些问题还是会记录

    2024年02月03日
    浏览(41)
  • Unity 关于生命周期函数的一些认识

    Unity 生命周期函数主要有以下一些: Awake() : 在脚本被加载时调用。用于初始化对象的状态和引用。 OnEnable() : 在脚本组件被启用时调用。在脚本组件被激活时执行一次,以及在脚本组件被重新激活时执行。 Reset() : 在脚本组件被重置时调用。用于重置脚本的初始状态。 Start

    2024年01月21日
    浏览(54)
  • Unity中常见的脚本生命周期函数及顺序

    以下是Unity中常见的脚本生命周期函数的顺序: Awake():当对象被创建时调用,用于初始化对象的引用和状态。 OnEnable():在对象变为激活状态时调用,用于进行初始化操作。 Start():在 Awake 之后调用,用于在对象被启用前进行初始化操作。 FixedUpdate():固定的时间间隔(一般

    2024年02月06日
    浏览(43)
  • 【Unity】认识常用的生命周期函数(Awake、Start、Update...)

    游戏的本质就是一个死循环 每一次循环都会处理游戏逻辑 并 更新一次游戏画面 之所以能看到画面在动 是因为 切换画面速度达到一定速度时 人眼就会认为画面是动态且流畅的 一帧就是执行了一次循环 Unity底层已经封装好了这个死循环 我们只需要利用Unity的生命周期函数的

    2024年02月02日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包