【Unity3D 教程系列第 10 篇】Unity 脚本中的生命周期流程图
这是【Unity3D 教程系列第 10 篇】,如果觉得有用的话,欢迎关注专栏。
文章目录
- 一:生命周期流程图
- 二:常用的生命周期函数
- 三:脚本初始化和销毁
- 四:脚本的动态添加与静态添加
- 五:Awake 与 Start 谁更适合访问脚本数据?
- 六:渲染用到的周期函数
一:生命周期流程图
Unity 脚本有一套完整的生命周期,脚本需要挂在任意游戏对象上,并且同一个游戏对象可以挂不同的脚本,各个脚本执行自己的生命周期,它们可以相互组合并且互不干扰。
学习脚本的生命周期之前,我们不得不引用文档中非常经典的一张图,这张图完整地描述了脚本的生命周期,如下图所示
生命周期中的所有方法都是 Unity 系统自己回调的,不需要手动调用,主要有编辑脚本,初始化,物理碰撞事件,更新回调,渲染和销毁等。
二:常用的生命周期函数
- Awake :Awake 隔帧后会调用 Start,并且只会调用一次,OnEnable 每次被激活时都会被调动。
- FixedUpdate :固定更新,会按照设置的时间固定频率来循环更新,关于FixedUpdate与Update,LateUpdate之间的区别
- yield :协程任务会在每一帧 Update 后,LateUpdate 之前执行。
- OnDisisable :在禁用脚本时调用,重新激活时将调用 OnEnable 方法。
三:脚本初始化和销毁
脚本挂在游戏对象上,运行时就会立即执行初始化方法 Awake,它是一个同步方法,如果游戏对象被删除,或者挂在它身上的脚本被删除,就会执行 OnDestroy 销毁方法。
需要记住的是,初始化或销毁,在脚本的生命周期中只会执行一次。
此外,游戏对象还有个状态,叫禁用状态,如下图红色标记,打对勾表示激活,取消对勾表示禁用。
在程序运行的过程中,可以多次设置激活/禁用,同时系统会分别回调生命周期中的 OnEnable 函数和 OnDisable 函数。
四:脚本的动态添加与静态添加
脚本既可以在运行时动态添加在游戏对象上,也可以运行游戏前预制挂在游戏对象上。动态添加的脚本按添加的先后顺序决定执行顺序,但是静态脚本因为提前挂在了游戏对象上,所以初始化的顺序就不一样了。
五:Awake 与 Start 谁更适合访问脚本数据?
例如,A 脚本先执行,B 脚本后执行,如果 A 脚本在自己的 Awake 方法中获取 B 脚本的数据,那么就会出错。
因为此时 B 脚本的初始化方法还没有执行。这就说明为什么在脚本生命周期中会提供 Start 方法,所以 Awake 方法适合做初始化,而在 Start 方法才适合安全地访问其它脚本数据。
特别注意
脚本挂得越多,执行效率就越低,这些脚本都需要执行生命周期的方法,此时 unity 需要遍历它们,然后再反射调用每个脚本的方法,所以我们能做的优化就是避免挂太多的脚本。
尤其避免在脚本中写入这种空方法,虽然没执行任何功能,但 unity 还是会去调用,所以,如果不需要,就把它删掉
六:渲染用到的周期函数
下面这些是关于渲染的周期函数,想了解的可以看下。
- OnPreCull
- 作用:在相机剔除场景之前调用此函数。相机可见的对象取决于剔除。OnPreCull 函数调用发生在剔除之前。
- OnBecameVisible / OnBecameInvisible
- 作用:在对象对于相机可见/不可见时调用此函数。
- OnWillRenderObject
- 作用:如果对象可见,则为每个相机调用一次此函数。
- OnPreRender
- 作用:在相机开始渲染场景之前调用此函数。
- OnRenderObject
- 作用:在完成所有常规场景渲染后调用此函数。可使用 GL 类或 Graphics.DrawMeshNow 绘制自定义几何图形。
- OnPostRender
- 作用:在相机完成场景渲染后调用此函数。
- OnRenderImage
- 作用:在完成场景渲染后调用此函数,以便对屏幕图像进行后处理(仅限专业版)。
- OnDrawGizmos
- 用于在场景视图中绘制小图示 (Gizmos),以实现可视化目的。
- OnGUI
- 作用:在每帧上多次调用此函数,以响应 GUI 事件。程序首先将处理 Layout 和 Repaint 事件,然后再处理每个输入事件的 Layout 和 keyboard 鼠标事件。
你的问题得到解决了吗?欢迎在评论区留言。
赠人玫瑰,手有余香,如果觉得文章不错,希望可以给个一键三连,感谢。
结束语
技术是一点一点积累的,大神也不是一天就可以达到的。原地不动就是退步,所以每天进步一点点。
最后,附上一句格言:"好学若饥,谦卑若愚",望共勉。
【Unity3D 教程系列第 10 篇】Unity 脚本中的生命周期流程图相关推荐
- 【C# 教程系列第 10 篇】c# 中如何让指定类不能被继承?
这是[C# 教程系列第 10 篇],如果觉得有用的话,欢迎关注专栏. 有时候我们并不希望自己写的类被继承,怎么做呢? 方法很简单,只需要在定义类时加上 sealed 关键字,用 sealed 关键字声 ...
- 【jQuery 教程系列第 10 篇】jQuery 中的过滤选择器(基本筛选器)
这是[jQuery 教程系列第 10 篇],如果觉得有用的话,欢迎关注专栏. jQuery 中除了一些 基本选择器 ,也有一些过滤选择器,本篇博客仅挑选其中的几个简单说明一下,其它的大家可以点击 jQ ...
- 【Unity3D 教程系列第 12 篇】如何用Unity写一个简易的计时器工具?
这是[Unity3D 教程系列第 12 篇],如果觉得有用的话,欢迎关注专栏. 平常关于延时的处理很多人都喜欢用携程去处理,但是在 Unity 里,并不建议大家用过多的携程,因为会出现一些莫名其妙的 ...
- 【Unity3D 教程系列第 19 篇】Unity 中根据长方体模型的尺寸添加碰撞盒 BoxCollider
这是[Unity3D 教程系列第 19 篇],如果觉得有用的话,欢迎关注专栏. 前言: 给一个长方体模型添加碰撞盒 BoxCollider,即使手动拖拽也费不了多长时间,但手动拖动不仅显得 Low , ...
- 【Unity3D 教程系列第 1 篇】Unity如何去掉自带动画?
这是[Unity3D 教程系列第 1 篇],如果觉得有用的话,欢迎关注专栏. 打开Unity,在左上角点击 File 选项后,执行如下操作 文解步骤:File → BuildSetting → Pla ...
- 【Unity3D 教程系列第 14 篇】如何解决启动 Unity 时,一直卡在 Loading 界面不动的问题?
这是[Unity3D 教程系列第 14 篇],如果觉得有用的话,欢迎关注专栏. 文章目录 一:问题截图 二:解决方案 方案一:文解过程 方案二:图解过程 一:问题截图 解决方案 一:问题截图 二:解决 ...
- 【Unity3D 教程系列第 15 篇】本地数据持久化之 Playerprefs 类
这是[Unity3D 教程系列第 15 篇],如果觉得有用的话,欢迎关注专栏. 文章目录 一:什么是 PlayerPrefs 类 二:PlayerPrefs 类中的静态方法 1:写入数据 2:读取数据 ...
- 【Unity3D 教程系列第 16 篇】Scene视图很清楚,但是Game视图却很模糊的解决方案
这是[Unity3D 教程系列第 16 篇],如果觉得有用的话,欢迎关注专栏. 如果你用 Unity 时,Scene 视图上很清楚,但是 Game 视图却很模糊,恭喜你,你的问题即将被解决了,继续看- ...
- 【Mac 教程系列第 10 篇】如何在 Mac 上破解带有密码的 ZIP 压缩文件
这是[Mac 教程系列第 10 篇],如果觉得有用的话,欢迎关注专栏. 我们知道如果是一般的压缩文件,可以用系统自带的或者很好用的压缩工具 Keka 来解压,但如果要解压的压缩文件设置了密码,这个时候 ...
最新文章
- plsql developer的一些使用
- 速领:1024大礼包
- python利器怎么编程-Python任务调度利器之APScheduler详解
- Mac下安装配置Python2和Python3并相互切换使用
- 聚类(Clustering): K-means算法
- 【Java】深入剖析Java输入输出的那些细节
- 《奠基计算机网络》2011年8月15日出版 视频下载 http://www.91xueit.com
- Unieap3.5-Grid编辑列中数字与下拉改变
- Ubuntu系统下如何在不重启的情况下永久修改hostname主机名
- 腐蚀rust图纸怎么找_怎么解决变压器油滤油机的温差效应?在这里可以得到解决...
- (dp)openjudge 复杂的整数划分问题
- 图解n=4的汉诺塔问题
- 监督学习的基本假设——联合概率分布,独立同分布
- 抖音返利分销模式及代理系统开发
- 微型计算机常见的输入与输出设备,微型计算机的输入输出设备.doc
- 实现安全登录的两种方法
- Xcode 常用编译选项设置
- 湖南师范大学计算机专业研究生读几年,湖南师范大学计算机专业在职研究生培养方式是怎样的?...
- pyshark引用TShark时:TShark not found的解决方法
- 财务机器人RPA推动财务职能转换