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

目录

  • 脚本生命周期
    • MonoBehavior生命周期图
  • 脚本执行顺序
    • 自定义执行顺序

@(文章目录)

在Unity中,脚本可以理解为附加在游戏对象上的用于定义游戏对象行为的指令代码。必须绑定在游戏对象上才能开始它的生命周期。游戏对象可以理解为能容纳各种组件的容器,游戏对象的所有组件一起决定了这个对象的行为和游戏中的表现。

脚本生命周期

Unity脚本中的常见必然事件如下表所示

名称触发时机用途
Awake脚本实例被创建时调用用于游戏对象的初始化,注意Awake的执行早于所有脚本的Start函数
OnEnable当对象变为可用或激活状态时被调用用途
StartUpdate函数第一次运行之前调用用于游戏对象的初始化
Update每帧调用一次用于更新游戏场景和状态
FixedUpdate每个固定物理时间间隔调用一次用于物理状态的更新
LateUpdate每帧调用一次(在update之后调用)用于更新游戏场景和状态,和相机有关的更新一般放在这里
OnGUI渲染和处理OnGUI事件用途
OnDisable当前对象不可用或非激活状态时被调用用途
OnDestroy当前对象被销毁时调用用途

下面将以代码来看看这些必然事件的调用时机
新建一个C#脚本,并添加以下代码,然后将其挂到任意的游戏对象上

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class TestTest : MonoBehaviour
{private void Awake(){Debug.Log("Awake");}private void OnEnable(){Debug.Log("OnEnable");}// Start is called before the first frame updatevoid Start(){Debug.Log("Start");}// Update is called once per framevoid Update(){Debug.Log("Update");}private void FixedUpdate(){Debug.Log("FixedUpdate");}private void LateUpdate(){Debug.Log("LateUpdate");}private void OnGUI(){Debug.Log("OnGUI");}private void OnDisable(){Debug.Log("OnDisable");}private void OnDestroy(){Debug.Log("OnDestroy");}
}

打印结果如下图示:

打印结果

可以发现,Awake, Start函数都是在游戏对象被创建时调用一次。
当游戏过程中调整脚本的可见状态时,会分别调用OnEnable, OnDisable函数,而Awake和Start将不会再调用,也就是说一旦脚本被挂载上以后,Awake和Start有且仅会被执行一次。
而Update, FixedUpdate, LateUpdate, OnGUI函数是会在游戏过程中被多次调用的(日志窗口右侧的数字表示该条日志信息打印的次数)。
最后在游戏对象被销毁时,会依次调用OnDisable, OnDestory函数。

MonoBehavior生命周期图

下面再放上一张外国友人所画的生命周期图

生命周期图

脚本执行顺序

在游戏开发中,不可避免的会使用许多脚本,那么如何确定不同脚本之间调用的先后顺序呢

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Test1 : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){Debug.Log("start 1");}private void Awake(){Debug.Log("awake 1");}// Update is called once per framevoid Update(){Debug.Log("update 1");}
}

将上面的代码依次添加到Test1, Test2和Test3脚本中(适当修改打印的日志),并挂载到不同的游戏对象上。
挂载的顺序为先挂载Test3,再挂载Test2,最后挂载Test1
打印结果如下图所示
打印结果

打印结果是先打印Test1的,再打印Test2,最后打印Test3。
其实脚本的执行顺序与挂载到游戏对象上的先后顺序有关。最先被挂载的最后执行,最后被挂载的最先执行(如果读者有疑惑,可以不断调整脚本的挂载顺序,看日志打印与上述结论是否相符)。

需要注意的是,无论多个脚本的执行顺序如何,但所有脚本的Awake函数一定会比所有的Start函数先执行完,所有的Start函数一定也会比所有的Update函数先执行完,其他有顺序的生命周期函数也是类似的(从上图的日志信息中也可以看出)。

自定义执行顺序

有时可能有这样的需求,A脚本中的属性实例化可能需要用到B脚本中的属性,所以在A脚本属性实例化时,必须保证B脚本已经被实例化完毕。当然我们可以通过先挂在A脚本再挂载B脚本来实现。但在实际开发中,用到的脚本中多,很难去记住各个脚本挂载的先后顺序。所以Unity提供了Script Execution Order配置项,来配置多个脚本的执行顺序。
在工程面板中任意点击选中一个脚本文件,在属性面板中会出现该脚本的详细信息,选择右上角的Execution Order...,打开如下图所示界面

执行顺序界面

点击“+”可以添加脚本,为其设置order值,order值越小的越先执行,order值越大的越后执行

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

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

相关文章

【转载保存】Java丨jsoup网络爬虫登录得到cookie并带上cookie访问

优秀文章:https://blog.csdn.net/wisdom_maxl/article/details/65631825 jsoup使用cookie&#xff1a; Set<Cookie> cookie_set LoadCSDN.load(); // WebClient wc new WebClient();HashMap<String, String> map new HashMap<String,String>();for (Cook…

Unity3D(UE4)加载倾斜摄影数据OSGB格式

在Unity3D平台动态加载调度倾斜摄影数据&#xff0c;利用多线程动态加载瓦片数据&#xff0c;可以顺畅加载海量的瓦片数据。目前测试可流畅加载100G左右数据&#xff0c;支持加载本地数据&#xff0c;数据可不放在Unity工程内&#xff0c;也可以将数据放置在服务器上实现网络加…

【转载保存】Jsoup解析html常用方法

首先我们要清楚 class的继承关系 Document 继承于 Element 继承于 Node 继承于 Object 首先 我们先研究一下 Element 中的函数作用: 01 addClass(String className) --> 添加一个class名字 到这个元素的class属性上. 02 after(Node node) --> 将指定的节点添加…

Unity打包失败解决方案

更改设置即可 &#xff1a;Edit -> Graphics Emulation-> Shader Hardware Tier 1

【转载保存】接口的压力测试工具

https://blog.csdn.net/luosaosao/article/details/72900072

Unity3D实现谷歌数字地球

Unity3D实现谷歌地球 在Unity3d平台实现的类似谷歌地球的功能&#xff0c;可动态加载谷歌&#xff0c;ArcGis,BingMap,天地图影像&#xff0c;也可加载国界线等矢量文件以及在线加载高程文件。 视频链接: 地球操作:https://www.bilibili.com/video/BV1mT4y1P771 地球漫游:h…

Unity下载安装网址

https://unity.cn/releases

【转载保存】java牛逼的开源项目汇总

http://blog.longjiazuo.com/archives/2625?hmsrtoutiao.io&utm_mediumtoutiao.io&utm_sourcetoutiao.io

Unity罗技方向盘接入

要想在Unity中接入罗技方向盘的数据&#xff0c;首先必须安装驱动&#xff0c;并且打开安装的软件&#xff0c;否则在Unity中会一直连接不成功。状态如下&#xff1a; 然后下载相应的开发包Logitech SDK即可&#xff0c;需要替换相应的LogitechSteeringWheelEnginesWrapper.dll…

sscanf

sscanf&#xff08;&#xff09; 2010-01-28 11:53:42| 分类&#xff1a; Work|举报|字号 订阅 下载LOFTER我的照片书 |定义函数 int sscanf (const char *str,const char * format,........); 函数说明 sscanf()会将参数str的字符串根据参数format字符串来转换并格…

【转载保存】网页提取正文算法汇总

正文抽取算法&#xff1a; 1.Html2Article &#xff1a;http://www.cnblogs.com/jasondan/p/3497757.html 2.基于行块分布函数的网页正文抽取算法代码实现https://blog.csdn.net/leiguang55555/article/details/51959646 源码下载: https://blog.csdn.net/red4711/article/deta…

ModBus协议寄存器

ModBus有四种数据&#xff0c;DI、DO、AI、AO DI: 数字输入&#xff0c;离散输入&#xff0c;一个地址一个数据位&#xff0c;用户只能读取它的状态&#xff0c;不能修改。比如面板上的按键、开关状态&#xff0c;电机的故障状态。 DO: 数字输出&#xff0c;线圈输出&#xf…

字典树

微博:TankyWoo基新博客:TankyWooTanky Woo的前博客 字典树&#xff08;讲解模版&#xff09; 又称单词查找树&#xff0c;Trie树&#xff0c;是一种树形结构&#xff0c;是一种哈希树的变种。典型应用是用于统计&#xff0c;排序和保存大量的字符串&#xff08;但不仅限于字符串…

Unity3D谷歌地球

Unity3D实现谷歌地球 在Unity3d平台实现的类似谷歌地球的功能&#xff0c;可动态在线加载谷歌&#xff0c;ArcGis,BingMap,天地图等影像&#xff0c;也可加载国界线等矢量文件以及在线加载高程文件。 视频链接: 地球操作:https://www.bilibili.com/video/BV1mT4y1P771 地球…

【转载保存】获取页面编码

https://blog.csdn.net/u010061897/article/details/9116879

Unity OnTriggerEnter不调用

Unity OnTriggerEnter不调用需要在对象上添加Rigidbody组件&#xff01;

jsoup的Elements类

一、简介 该类是位于select包下&#xff0c;直接继承自Object&#xff0c;所有实现的接口有Cloneable, Iterable, Collection, List 类声明&#xff1a;public class Elements extends Object implements List, Cloneable 可以使用Element.select(String) 方法去得到Element…

线段树的操作

登录 | 注册 MetalSeed 思绪来得快去的也快&#xff0c;偶尔会在这里停留。 目录视图摘要视图订阅 移动信息安全的漏洞和逆向原理 程序员11月书讯&#xff0c;评论得书啦 Get IT技能知识库&#xff0c;50个领域一键直达数据结构专题——线段树 标签&#xff1a; …

UnrealEngine4 - 关于UObject被自动GC垃圾回收的巨坑

1 出现的问题 在一个插件中新建了一个静态的继承于UObject的对象 static UMyObject* m_Object nullptr; 1 然后在插件的蓝图函数中对其进行了初始化: m_Object NewObject<UMyObject>(); 1 过了一段时间之后发现这个对象被析构&#xff0c;导致野指针&#xff0c;造成…

【转载保存】Java+Selenium使用

环境搭建&#xff1a;https://blog.csdn.net/u011541946/article/details/72898514 环境搭建问题解决&#xff1a;https://blog.csdn.net/u010366748/article/details/72872190 package server;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By; import o…