生命周期

  • 生命周期图
  • 生命周期流程细节分析
    • 编辑期间执行的方法
      • 1.初始化:
      • 2.更新:
    • 运行期间执行的方法
        • 1.初始化:
      • 一帧更新开始
        • 2.物理更新
        • 3.输入事件
        • 4.逻辑更新
        • 5.场景渲染
        • 6.线框渲染
        • 7.GUI 渲染
      • 一帧更新结束
        • 8.游戏退出
  • 总结

生命周期图

在使用 unity 引擎开发之前,你一定要先了解它脚本的生命周期,这样方便开发,更方便你阅读别人的代码,话不多说直接开始。

unity 中定义了很多非常重要的事件函数,先来一个图,图中详细介绍了 unity 中所有重要的事件函数,这个图是从 untiy 官网文档中复制下来的 这里我使用的 unity 版本是 2017.4.30 版本的。

生命周期流程细节分析

介绍这个生命周期要分两部分,编辑期间,运行期间:因为,这两部分中会分别运行一些方法,我们需要根据实际情况去分析。

我这里只介绍一些重要的部分,不会每一个去分析。

编辑期间执行的方法

1.初始化:

  • Reset() 重置函数编辑期当脚本首次赋值给游戏对象时触发一次,只在编辑期间,执行一次,如果你在运行期间将一个脚本动态加载到一个对象上,这个函数也是不会执行的;

2.更新:

  • OnDrawGizmos() 函数,这个函数在编辑期间和在运行期间调用频率不同,在编辑期间,它不是像 Update 那种每一帧更新,只在 Scene 视图打开的时候,在这个视图下操作,会调用这个函数,在只打开 Game 视图中,操作物体,不会调用这个函数,所以在编辑期间和游戏运行期间,只要你打开了 Scene 视图,就会调用这个函数。
    打开 scene 视图,随便移动图中 正方体,该函数一直在被调用,不移动的时候,就会停下来,只要你的鼠标在上面动了,它就会一直调用,直到你不操作这个视图,这个函数就不会调用:

    只打开 Game 视图,随便更改坐标,材质等,都不会调用这个函数:


如果要想在编辑器下执行以下更新函数: Update,LateUpdate,OnWillRenderObject,OnGUI 等,可以在自定义类前加入 “[ExecuteInEditMode]” 即可,如下图,具体实现顺序,如生命周期图所示,或者和下面执行阶段中执行顺序相同,这里不过多介绍,建议自己多做尝试。

运行期间执行的方法

1.初始化:

  • Awake() 唤醒函数最先执行的函数,用于优先级最高的事件处理,执行一次(如果说,一开始对象就没有激活,一直处于一个隐藏的状态,在游戏运行的时候,是不会触发 Awake 的,直到第一次激活这个对象才会触发这个函数,后序连续启用禁用都不会再触发这个函数了,小心踩坑,书写代码一定要注意这种情况)
    (之前项目中遇到一个设计缺陷:一个接口在对某个对象中的某个组件的初始值做了初始化,但是这个对象还没有被激活过,所以当这个对象第一次被激活的时候,因为那个组件走了 Awake 导致之前初始化的数据被重置了,然后没有到达预期的效果
    挂载对象未激活:不调用
    挂载对象已激活,脚本未激活:调用
    挂载对象已激活,脚本已激活:调用

  • OnEnable() 启动函数与 OnDisable() 配套结合,当脚本启用的时候触发,随着脚本的不断启用和禁用来回切换,执行多次
    挂载对象未激活:不调用
    挂载对象已激活,脚本未激活:不调用
    挂载对象已激活,脚本已激活:调用

  • OnApplicationPause(bool pause) 函数,这个函数主要发生在 “切后台”,当你打开别的 app 时,这个函数会自动调用,并且 “pause 为 true”,当你再切回来的时候,这个函数自动调用,并且 “pause 为 false”,可以执行多次;在引擎刚开始运行时,以下情况也会自动调用一次 “pause 为 false”,正常情况下是在 OnEnable 函数之后,在游戏运行以后,发生如下情况,都不会调用。
    挂载对象未激活:不调用
    挂载对象已激活,脚本未激活:调用
    挂载对象已激活,脚本已激活:调用

  • Start() 开始函数,一般用于给脚本字段初始值使用,执行一次,注意这里的 Start 没有 On 作为前缀;
    挂载对象未激活:不调用
    挂载对象已激活,脚本未激活:不调用
    挂载对象已激活,脚本已激活:调用

    游戏运行时,挂载对象已激活,脚本也激活,函数运行的顺序如下:


游戏运行时,挂载对象已激活,脚本未激活,函数运行的顺序如下:

一帧更新开始

更新中的所有函数都遵循以下规则,OnDrawGizmos 这个函数除外:
挂载对象未激活:不调用
挂载对象已激活,脚本未激活:不调用
挂载对象已激活,脚本已激活:调用

2.物理更新

  • FixedUpdate() 固定更新函数,以默认 0.02s 的时钟频率执行,常用于物理学模拟中处理刚体的移动等,每秒执行多次,如果固定帧步长小于实际帧更新时间,那么每一帧的物理周期中,这个函数会被调用多次;

3.输入事件

这里与其相关函数事件较多,不做特别分析。

4.逻辑更新

  • Update() 更新函数,执行的频率不固定,与计算机当前性能消耗成反比,常用于逻辑计算,每秒执行多次
  • LateUpdate() 后更新函数,在上面两个更新函数之后运行,常用于摄像机的控制情形中,每秒执行多次

5.场景渲染

  • OnWillRenderObject() 函数,如果对象可见,每个照相机调用一次(这是官方解释)。通常对于一些确定要渲染的对象,在正式渲染前再做一些特殊处理,比如裁剪,材质的重置等。

6.线框渲染

  • OnDrawGizmos() 函数,在 Scene 视图打开的时候每一帧更新,和在 编辑器模式下调用的频率不同。
    如果打开了 Game 视图:
    挂载对象未激活:不调用
    挂载对象已激活,脚本未激活:不调用
    挂载对象已激活,脚本已激活:不调用
    如果打开了 Scene 视图:
    挂载对象未激活:不调用
    挂载对象已激活,脚本未激活:每一帧调用
    挂载对象已激活,脚本已激活:每一帧调用

7.GUI 渲染

  • OnGUI() 图形绘制函数,绘制系统UI界面,每秒执行多次,每一帧更新多次;

一帧更新结束

8.游戏退出

  • OnApplicationQuit() 函数,在运行结束的时候调用,执行一次
    挂载对象未激活:不调用
    挂载对象已激活,脚本未激活:调用
    挂载对象已激活,脚本已激活:调用

  • OnDisable() 脚本禁用函数与 OnEnable() 配套结合,当脚本被禁用的时候触发,随着脚本的不断启用和禁用来回切换,执行多次,如果脚本在游戏退出时一直处于 “激活”状态,那么游戏退出的时候就会自动调用这个函数;
    挂载对象未激活:不调用
    挂载对象已激活,脚本未激活:不调用
    挂载对象已激活,脚本已激活:调用

  • OnDestory() 销毁函数,本脚本所属游戏对象销毁的时候执行,执行一次,在游戏退出时未被销毁的对象(包括激活对象,和未激活对象),就会自动调用;
    挂载对象未激活:不调用
    挂载对象已激活,脚本未激活:调用
    挂载对象已激活,脚本已激活:调用

在游戏结束的时候,挂载对象已激活,脚本已激活,分别执行以下函数,并且执行顺序如下:


在游戏结束的时候,挂载对象已激活,脚本未激活,分别执行以下函数,并且执行顺序如下:

总结

(这里 FixedUpdate 等每秒执行多次的函数,因为执行次数太多,我代码中限制了打印次数)

Unity 生命周期相关推荐

  1. 【Unity】Unity 生命周期

    文章目录 旧版Unity生命周期 - 官方旧版生命周期 - 个人整理翻译版本 新版Unity生命周期 - 官方新版生命周期 - 个人整理翻译版本 生命周期函数 1.初始化阶段 Awake(唤醒) On ...

  2. Unity 生命周期 Reset() 的使用

    在非运行状态下 左键点击小齿轮(右上角的),选择Reset; 不运行,也可以进行调用.打印东西出来

  3. 自定义Unity对象生命周期管理集成ADO.NET Entity Framework

    在Unity中,从Unity 取得的实例为 Transient.如果你希望使用多线程方式,就需要在组成时使用lifecycle参数,这时候取出的组件就不再是同一个了.在Unity IOC中,它支持我们 ...

  4. unity 脚本中 调用另一个脚本_Unity 2019.4 脚本生命周期

    脚本生命周期流程图 加载第一个场景 场景开始时将调用以下函数(为场景中的每个对象调用一次). Awake:始终在任何 Start 函数之前并在实例化预制件之后调用此函数.(如果游戏对象在启动期间处于非 ...

  5. Unity脚本生命周期与执行顺序

    目录 脚本生命周期 MonoBehavior生命周期图 脚本执行顺序 自定义执行顺序 @(文章目录) 在Unity中,脚本可以理解为附加在游戏对象上的用于定义游戏对象行为的指令代码.必须绑定在游戏对象 ...

  6. Unity中场景生命周期的监听: EditorSceneManager

    本文分享Unity中场景生命周期的监听: EditorSceneManager 在Unity开发中, 有时我们需要在场景的某些生命周期时做一些特定的操作, 特别是在Editor模式下的一些工具代码. ...

  7. 【Unity3D 教程系列第 10 篇】Unity 脚本中的生命周期流程图

    这是[Unity3D 教程系列第 10 篇],如果觉得有用的话,欢迎关注专栏. 文章目录 一:生命周期流程图 二:常用的生命周期函数 三:脚本初始化和销毁 四:脚本的动态添加与静态添加 五:Awake ...

  8. Unity 协程开启、停止与生命周期

    StopAllCoroutines只会停止调用这个接口的脚本实例对象上的所有协程,而非调用这个接口脚本的所有实例对象. 协程被打断 使用Unity的MonoBehavior组件开启一段协同程序非常方便 ...

  9. Unity脚本(2) --- 脚本生命周期以及脚本的控制台调试

    1.什么是脚本生命周期? 首先什么是脚本 --- 脚本的本质其实就是类,而脚本生命周期其实就是脚本对应的那个类从开始工作到最后销毁这么一个周期 (或者说是Unity脚本从唤醒到销毁的过程) (消息,必 ...

  10. unity脚步的生命周期

    unity脚步的生命周期 1 下面这些方法可以在编辑器中显示 2 初始阶段 1 Awake() 2 Start() 3 OnEnable() 4 总结 3 物理阶段 1 FixedUpdate() 2 ...

最新文章

  1. 批处理中的****1nul 2nul
  2. IOS App 后台运行
  3. 问问题要量化,要具体
  4. Windows与VMware下的Linux文件共享方式总结
  5. 一款jquery实现的整屏切换特效
  6. Python学习week7-文件路径操作
  7. python 清空文件夹_Python初学者请注意!别这样直接运行python命令,否则电脑等于“裸奔”...
  8. IIS设置的解决方案
  9. 简单51单片机c语言编程流水灯,51单片机如何实现流水灯?51单片机实现流水灯的三种方法详细分析...
  10. 计算机组成原理计算tag,计算机组成原理计算题
  11. 基于GDAL实现的PCA变换(主成分分析)
  12. Sparkstreaming实时开发详解
  13. 压缩感知(Compressed sensing)from wiki
  14. 转存文章— 网游加速器实现原理解析
  15. FX2N-2DA模拟量输出模块简述
  16. linux edt时间转成cst时间,edt时间和北京时间换算(edt时间 现在)
  17. OpenCV鼠标修改图片透明度
  18. 怎样利用计算机电源,计算机电源功耗如何计算?如何使用电脑功率计算器?
  19. jeecgboot自动关闭本页标签Tab页
  20. cuda ptx 汇编语言示例:读寄存器

热门文章

  1. 【艾琪出品】《计算机应用基础》【试题汇总4】
  2. 论文解读:Predator-Pray biogeography Based Optimization (PPBBO)
  3. linux系统缺少perl组建中的Data::Dumper模块
  4. 17.分段函数、绝对值函数以及幂指函数求导
  5. 简单修复360安全检测提示的发现robots文件漏洞
  6. Linux 运维职业困惑?给你史上最全互联网 Linux 工作规划!
  7. sql盲注特点_sql盲注
  8. [Hadoop in China 2011] 朱会灿:探析腾讯Typhoon云计算平台
  9. 在线检测本机ip的网站
  10. java 中文星期表示_java之获得中文星期几