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,一经查实,立即删除!

相关文章

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

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

Unity打包失败解决方案

更改设置即可 :Edit -> Graphics Emulation-> Shader Hardware Tier 1

Unity3D实现谷歌数字地球

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

Unity罗技方向盘接入

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

sscanf

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

字典树

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

Unity3D谷歌地球

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

线段树的操作

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

UE4加载osgb倾斜摄影数据

在UE4引擎中动态加载调度osgb倾斜摄影数据,利用多线程动态加载瓦片数据,可以顺畅加载海量的瓦片数据。最大可加载200G以上数量级。 Unity3D加载osgb倾斜摄影数据:Unity3d(UE4)动态加载osgb倾斜摄影数据_Answer-3的博客-CSDN博客_unity加载osgb qq:1749…

Unity/UE读取OPC UA和OPC DA数据(UE4)

Unity/UE4通过OPC UA和OPC DA协议读取PLC数据,通过采集服务将数据采集到数据库中,Unity3d和UE4再从数据库中读取数据进行展示,用于三维数字孪生系统接入自动化系统的硬件数据。支持WinCC,组态王,Kepware等组态软件的数据接入。 W…

Unity3d(UE4)动态加载osgb倾斜摄影数据

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

RMQ算法

RMQ算法 标签: 算法querytable2012-08-28 20:53 14613人阅读 评论(7) 收藏 举报分类:nyist(26) 数据结构(5) 1. 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询…

bellman ford 算法 判断是否存在负环

Flyer 目录视图摘要视图订阅 微信小程序实战项目——点餐系统 程序员11月书讯,评论得书啦 Get IT技能知识库,50个领域一键直达关闭bellman ford 算法 2013-05-25 15:36 11148人阅读 评论(0) 收藏 举报分类:ACM(11&a…

C++ vector用法

C vector用法 在c中&#xff0c;vector是一个十分有用的容器&#xff0c;下面对这个容器做一下总结。 1 基本操作 (1)头文件#include<vector>. (2)创建vector对象&#xff0c;vector<int> vec; (3)尾部插入数字&#xff1a;vec.push_back(a); (4)使用下标访问元素&…

字典树(Trie树)

字典树(Trie树)字典树&#xff0c;又称单词查找树&#xff0c;Trie树&#xff0c;是一种树形结构&#xff0c;典型应用是用于统计&#xff0c;排序和保存大量的字符串&#xff0c;所以经常被搜索引擎系统用于文本词频统计。它的优点是&#xff1a;利用字符串的公共前缀来节约存…

网络流之最大流算法(EdmondsKarp)

网络流之最大流算法&#xff08;EdmondsKarp&#xff09; 标签&#xff1a; 网络流算法EdmondsKarp流量最大流2014-03-11 18:05 34795人阅读 评论(12) 收藏 举报分类&#xff1a;图论~~网络流&#xff08;26&#xff09; 版权声明&#xff1a;本文为博主原创文章&#xff0c;未…

set 用法

Set常用用法 2013-04-22 19:24 86508人阅读 评论(1) 收藏 举报分类&#xff1a;CPlus&#xff08;54&#xff09; set集合容器&#xff1a;实现了红黑树的平衡二叉检索树的数据结构&#xff0c;插入元素时&#xff0c;它会自动调整二叉树的排列&#xff0c;把元素放到适当的位置…

C语言用递归求斐波那契数,让你发现递归的缺陷和效率瓶颈

C语言用递归求斐波那契数&#xff0c;让你发现递归的缺陷和效率瓶颈 分享到&#xff1a;QQ空间新浪微博腾讯微博豆瓣人人网递归是一种强有力的技巧&#xff0c;但和其他技巧一样&#xff0c;它也可能被误用。一般需要递归解决的问题有两个特点&#xff1a;存在限制条件&#xf…

C语言中文件的读取和写入

C语言中文件的读取和写入 注意&#xff1a; 1、由于C是缓冲写 所以要在关闭或刷新后才能看到文件内容 2、电脑处理文本型和二进制型的不同 &#xff08;因为电脑只认识二进制格式&#xff09; 在C语言中写文件 //获取文件指针 FILE *pFile fopen("1.txt", //打开文件…

mysql 常用操作

mysql 常用操作&#xff08;整理&#xff09; 标签&#xff1a; MYSQL常用操作 2013-07-22 16:37 10846人阅读 评论(0) 收藏 举报 本文章已收录于&#xff1a; 分类&#xff1a; MYSQL 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 目录(?)[]…