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

作者:iwiniwin 时间:2022-05-22 00:47:34 

一、脚本生命周期

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 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");
   }
}

打印结果如下图示:

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

可以发现,Awake, Start函数都是在游戏对象被创建时调用一次。
当游戏过程中调整脚本的可见状态时,会分别调用OnEnable, OnDisable函数,而Awake和Start将不会再调用,也就是说一旦脚本被挂载上以后,Awake和Start有且仅会被执行一次。

而Update, FixedUpdate, LateUpdate, OnGUI函数是会在游戏过程中被多次调用的(日志窗口右侧的数字表示该条日志信息打印的次数)。
最后在游戏对象被销毁时,会依次调用OnDisable, OnDestory函数。

二、MonoBehavior生命周期图

下面再放上一张的生命周期图

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

三、脚本执行顺序

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


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
打印结果如下图所示

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

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

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

四、自定义执行顺序

有时可能有这样的需求,A脚本中的属性实例化可能需要用到B脚本中的属性,所以在A脚本属性实例化时,必须保证B脚本已经被实例化完毕。当然我们可以通过先挂在A脚本再挂载B脚本来实现。但在实际开发中,用到的脚本中多,很难去记住各个脚本挂载的先后顺序。所以Unity提供了Script Execution Order配置项,来配置多个脚本的执行顺序。

在工程面板中任意点击选中一个脚本文件,在属性面板中会出现该脚本的详细信息,选择右上角的Execution Order... ,打开如下图所示界面

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

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

来源:https://www.cnblogs.com/iwiniwin/p/10799836.html

标签:Unity,生命周期,脚本,执行顺序
0
投稿

猜你喜欢

  • java高并发之线程组详解

    2023-02-15 21:30:25
  • SpringBoot实现监控Actuator,关闭redis监测

    2021-08-01 04:01:33
  • 关于java数组与字符串相互转换的问题

    2021-08-08 18:50:31
  • Java Pattern与Matcher字符串匹配案例详解

    2022-03-25 16:07:19
  • Spring在多线程下@Resource注入为null的问题

    2022-09-11 07:41:18
  • 教大家使用java实现顶一下踩一下功能

    2021-08-08 21:31:15
  • C#实现的海盗分金算法实例

    2023-12-20 21:00:53
  • 详解spring cloud Feign使用中遇到的问题总结

    2023-12-13 19:03:48
  • springboot webflux 过滤器(使用RouterFunction实现)

    2022-12-12 21:28:44
  • TextBox获取输入焦点时自动全选的实现方法

    2022-01-01 02:22:49
  • 关于@Entity和@Table注解的用法详解

    2022-05-15 15:29:04
  • Android自定义状态栏颜色与应用标题栏颜色一致

    2022-01-12 02:24:31
  • android中AutoCompleteTextView的简单用法(实现搜索历史)

    2023-01-08 18:33:01
  • Android通过AIDL在两个APP之间Service通信

    2022-04-15 23:58:27
  • c# 利用易福门振动模块VSE002采集振动数据的方法

    2022-10-13 00:12:25
  • java的io操作(将字符串写入到txt文件中)

    2022-05-28 22:59:23
  • QT实现简单计算器功能

    2021-08-19 21:47:19
  • C#中倒序输出字符串的方法示例

    2023-10-27 21:45:13
  • SpringBoot使用FreeMarker模板发送邮件

    2021-07-27 07:32:26
  • Java 常见的限流算法详细分析并实现

    2022-01-05 22:11:09
  • asp之家 软件编程 m.aspxhome.com