浅谈Unity脚本生命周期与执行顺序
作者:iwiniwin 发布时间:2022-05-22 00:47:34
一、脚本生命周期
Unity脚本中的常见必然事件如下表所示
名称 | 触发时机 | 用途 |
---|---|---|
Awake | 脚本实例被创建时调用 | 用于游戏对象的初始化,注意Awake的执行早于所有脚本的Start函数 |
OnEnable | 当对象变为可用或激活状态时被调用 | 用途 |
Start | Update函数第一次运行之前调用 | 用于游戏对象的初始化 |
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 update
void Start()
{
Debug.Log("Start");
}
// Update is called once per frame
void 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 update
void Start()
{
Debug.Log("start 1");
}
private void Awake()
{
Debug.Log("awake 1");
}
// Update is called once per frame
void 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值越大的越后执行
来源:https://www.cnblogs.com/iwiniwin/p/10799836.html


猜你喜欢
- 一.WebSocket简单介绍WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-d
- 本文实例讲述了java实现简单的英文文本单词翻译器功能。分享给大家供大家参考,具体如下:直接上代码:package fanyi;import
- 一、问题反馈今天公司测试向我反馈,系统用户模糊查询功能在用户名称包含特殊字符时(_、\、%)无法正常查询结果。二、问题验证1、当like中包
- GUI编程实现贪吃蛇小游戏,供大家参考,具体内容如下1、编写主方法实现启动类2、准备好素材图片,编写数据类3、代码主体部分:在panel面板
- 背景Springboot 默认把异常的处理集中到一个ModelAndView中了,但项目的实际过程中,这样做,并不能满足我们的要求。具体的自
- 主要介绍Android中如何使用rotate实现图片不停旋转的效果。Android 平台提供了两类动画,一类是 Tween 动画,即通过对场
- 首先分析一下问题:其实这个红框不是android的bug,把编译模式从eng改成user就可以了,红框只是eng模式debug的时候提示你系
- 1. 使用蓝牙的响应权限<uses-permission android:name="android.permission.
- 本文为大家分享了java画出五子棋游戏棋盘的方法,供大家参考,具体内容如下棋盘模块:画五子棋棋盘:19条横线、19条竖线步骤一:显示棋盘我有
- Android9.0无法通过以下两种方式实现静默安装:1.runtime执行shell cmd2.PackageInstall 反射机制但是
- 首先需要清楚一个概念:函数式接口;它指的是有且只有一个未实现的方法的接口,一般通过FunctionalInterface这个注解来表明某个接
- 摘要:1.日志输出到文件并根据LEVEL级别将日志分类保存到不同文件2.通过异步输出日志减少磁盘IO提高性能3.异步输出日志的原理1、配置文
- 前言需要对一个List中的对象进行唯一值属性去重,属性求和,对象假设为BillsNums,有id、nums、sums三个属性,其中id表示唯
- C# 中的每个类或结构都隐式继承 Object 类。因此,C# 中的每个对象都会获得 ToString 方法,此方法返回该对象的字符串表示形
- 1.先看源码文档/** * Indicates that an annotation type is automatically inher
- HandlerThread 顾名思义就是一种可以使用 Handler 的 Thread。日常开发中我们经常会通过创建一个 Thread 去执
- JVM自带的类加载器:其关系如下:其中,类加载器在加载类的时候是使用了所谓的“父委托”机制。其中,除了根类加载器以外,其他的类加载器都有且只
- 前言关于日志级别,大部分项目可能都设置为info级别,当然也可能有一些追求性能或者说包含很多敏感信息的项目直接将级别设置为warn或者err
- 前言这里介绍一个.net自身携带的类ImageAnimator,这个类类似于控制动画的时间轴,使用ImageAnimator.CanAnim
- 曾经自学C#做计算机图形学的作业,GDI+画图确实好用,目前在找.NET的实习,尝试做了一个最基本的五子棋,复习一下C#的基本语法,目前只能