Unity脚本生命周期与执行顺序
目录
- 脚本生命周期
- MonoBehavior生命周期图
- 脚本执行顺序
- 自定义执行顺序
@(文章目录)
在Unity中,脚本可以理解为附加在游戏对象上的用于定义游戏对象行为的指令代码。必须绑定在游戏对象上才能开始它的生命周期。游戏对象可以理解为能容纳各种组件的容器,游戏对象的所有组件一起决定了这个对象的行为和游戏中的表现。
脚本生命周期
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 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值越大的越后执行
Unity脚本生命周期与执行顺序相关推荐
- 附实例!图解React的生命周期及执行顺序
本文由云+社区发表 作者:前端林子 1.七个可选的生命周期 可以结合下图来看: (1) componentWillMount() 仅在render()方法前被调用一次,如果在该方法中调用了setSta ...
- vue父子组件生命周期执行顺序_关于Vue组件的生命周期及执行顺序
本文主要讲述了:Vue组件渲染时的生命周期及执行顺序 Vue组件数据变更时的生命周期及执行顺序 Vue组件嵌套时的生命周期及执行顺序 正文 组件渲染时的生命周期 在组件渲染时,每个Vue组件都有4个生 ...
- Unity3D脚本的生命周期(执行顺序)
Unity脚本中有许多固定的函数 例如Start();Update(); 而这些函数都有固定的执行顺序 搞清楚这些函数的执行顺序 对于我们理清代码的逻辑就显得尤为重要 举个简单的例子 //脚本A pu ...
- uniapp 常用生命周期以及执行顺序
uniapp 生命周期分为应用生命周期,页面生命周期,还有组件生命周期 我们先看一个例子: 这是项目结构,里面的App.vue是我们的App页面,应用的生命周期有onLaunch,onShow和onH ...
- Vue父子组件生命周期的执行顺序
加载渲染过程 父组件先创建,然后子组件创建:子组件先挂载,然后父组件再挂载 即生命周期如下 父beforeCreate 父created 父beforeMount 子beforeCreate 子cre ...
- vue 子父组件周期顺序_父组件和子组件生命周期钩子执行顺序是什么?
加载页面执行步骤 1.父组件:beforeCreate -> created -> beforeMount 2.子组件:beforeCreate -> created -> b ...
- Unity 脚本生命周期流程图
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 渲染 O ...
- unity 脚本中 调用另一个脚本_Unity 2019.4 脚本生命周期
脚本生命周期流程图 加载第一个场景 场景开始时将调用以下函数(为场景中的每个对象调用一次). Awake:始终在任何 Start 函数之前并在实例化预制件之后调用此函数.(如果游戏对象在启动期间处于非 ...
- Unity脚本(2) --- 脚本生命周期以及脚本的控制台调试
1.什么是脚本生命周期? 首先什么是脚本 --- 脚本的本质其实就是类,而脚本生命周期其实就是脚本对应的那个类从开始工作到最后销毁这么一个周期 (或者说是Unity脚本从唤醒到销毁的过程) (消息,必 ...
最新文章
- java 数组 列表_用Java将列表转换为数组
- SQLite入门与分析(二)---设计与概念
- buffersize越大越好吗_手机运行内存真的越大越好吗?看完长知识了
- 在悬崖下得到鸿蒙塔,第一次夜宿在悬崖峭壁上:垂直高度356米,峡谷深渊就在边上...
- ORA-25153: Temporary Tablespace is Empty
- 软件项目获取用户需求的沟通技巧(摘自IT168技术频道)
- PHP 中 9 大缓存技术总结
- 操作系统学习(五) 、代码段和数据段描述符
- PodPresent-K8s时区配置
- Angular.js中使用$watch监听模型变化
- 利用ida对程序的静态链接库进行处理
- sp_decrypt
- 旧版的rust怎么老是掉线_RUST服务器进不去 RUST掉线用什么加速器解决?
- 什么是 cisco ios
- Cortex-A7 MPCore 架构
- 南京地图njmaps使用,以公众版为例
- N 个Android 视频教程免费下载
- 腾讯副总裁姚星离职创业!一手筹建AI Lab,张潼张正友都曾向他汇报
- 贴片陶瓷电容的NPO、C0G、X7R、X5R、Y5V、Z5U区别
- Flutter中的浮动按钮 FloatingActionButton
热门文章
- php3绕过,PHPB2B注入#3(绕过过滤)
- php连接数据库非明文,MySQL 数据库配置 SSL 安全连接
- springboot api文档_SpringCloud/SpringBoot - 自动生成API文档
- 读取txt原理_Mysql客户端任意文件读取学习
- 在每个运行中运行多个查询_Spring Data JPA的运行原理及几种查询方式
- linux unix域socket_python3从零学习-5.8.1、socket—底层网络接口
- Java中AJAX工作原理是什么
- 为什么说Java 程序员必须掌握 Spring Boot?
- mysql 复制延迟诊断_新特性解读 | MySQL 8 复制延迟观测新方式,更全面更精准
- 采用计算机发布调度命令时 必须严格遵守,实用文档其他之铁路调度命令格式图片调度命令规范格式...