Unity之组件的生命周期

PS:第二天,依旧在摸鱼学unity

一、组件的概念

我本身是由Web后端转到了游戏后端,最近因为工作原因在学ET框架。学到了 ECS 编程模式开发(E —— Entity,C —— Component , S —— System)实体、组件、逻辑开发。

我是这么理解的:组件是挂载到实体上的,组件中记录了实体所需要的数据,然后实体的业务和行为在逻辑里编写。


举个例子:关羽拿青龙偃月刀斩了颜良,这里关羽看做实体,青龙偃月刀作为组件挂载在关羽身上,斩颜良是实体关羽所做出来的行为动作。

偷的表情包(手动狗头)

 那么问题来了:关羽可以拿刀砍人;我可以拿刀砍人;在看博客的你也可以拿刀砍人,难不成每次写程序都要新写一个刀组件?


写程序就要学会偷懒,游戏引擎的开发者们就把一些可以共用的组件抽出来,比如Unity里的Box Collider  ——  碰撞组件、Rigidbody  ——  重力组件(刚学Unity第二天一共就知道这俩 —— doge.jpg)

二、创建新组件并挂载

说到这里大家大概明白什么是组件了吧,这里我们创建一个新组件。在项目一栏的空白处点击鼠标右键创建一个C#脚本,我这里给它命名为Move。

如果我们想把组件添加到实体上,我目前知道的有三种方式

 或者点击添加组件按钮进行搜索

 这样我们就把组件挂到实体上了。

三、组件的生命周期函数

说完了怎么挂载组件我们正式进入正题,来谈谈组件的生命周期。所谓生命周期就是一个事物由创建到销毁的全过程。

我们双击打开创建好的C#脚本,它会打开编辑器,我这里用的是visual studio,打开后会看到下边这段代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Move: MonoBehaviour
{// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){}
}

 这里的  Start()Update() 是生命周期中的两种函数,此外还有 Awake() 、OnEnable() 、LateUpdate() FixedUpdate() 、OnDisable() 、OnDestroy()   ,一共八种,我们来看一下这些生命周期函数。

3.1  Awake()

Awake  ——  唤醒,这是当组件挂载在实体上第一个要执行的函数,庆祝诞生。我们来把 Debug.Log("awake");   的注释解开在控制台打印输出一下看看。

很简单接着往下看 

3.2 OnEnable()

OnEnable()  函数在Awake执行之后执行,每次激活组件都会调用一次,打印一下Log日志

看起来不难,但是这里的每次激活组件都会调用一次

每次激活??都会调用一次?? 来详细看,这个Move脚本旁边的   “√”   勾上就是激活,不勾就是不激活,我们反复勾一下可以看到下边控制台  awake  只执行了一次,而  OnEnable  执行了多次,这就是所谓的  每次激活组件都会调用一次。

3.3  Start()

 调用时机是第一次 OnEnable() 调用之后,只调用一次

我们来打印输出一下:

反复激活后可以看到 Start()只执行了一次。

3.4  Update()

Update() 每帧都会调用一次,帧数就是在1秒钟时间里传输的图片的数量 和电脑的性能有关

可以看到我刚运行一会就打印了一千多次了

3.5 LateUpdate()

LateUpdate(),看函数名就能猜出大概的作用,在 Update() 函数执行之后执行

3.6 FixedUpdate()

FixedUpdate()  每隔固定的时间间隔都会运行一次,和帧无关。

我第一次学这个函数的时候差点和  Update()  混了。


举个例子: 当用 Update() 函数的时候,关羽每秒可以砍 60 个人,而我每秒只能砍一个人还差点被反杀。

而当用  FixedUpdate()  函数的话我和关羽每秒砍的人数就一样了   约等于   我和关羽一样强(doge.jpg)


FixedUpdate() 函数默认每隔0.02秒执行一次。这里我们可以修改执行的时间间隔  ——  在unity界面上边菜单栏里  编辑——》 项目设置 ——》 时间 ——》 固定时间步进

3.7 OnDisable()

非激活状态下调用一次,和OnEnable是相对的关系。OnEnable()  函数懂了大家这个也就懂了吧😃,我们反复激活,来打印输出一下看看

没错,就是大家想的那样,激活 OnEnable()就会执行一次,不激活OnDisable() 就会执行一次。

3.8 OnDestroy()

终于最后一个函数了,当组件销毁的时候被调用,比如进行移除组件操作,要死了写遗书。

我们来移除组件:

移除后 OnDestory  就会打印出来了

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Move : MonoBehaviour
{//组件挂载在实体上第一个执行的函数,庆祝诞生private void Awake(){Debug.Log("awake");}//在Awake执行之后执行,每次激活组件都会调用一次private void OnEnable(){Debug.Log("OnEnable");}//唯一调用的,调用时机是第一次 OnEnable 调用之后// Start is called before the first frame updatevoid Start(){Debug.Log("Start");//Debug.Log("我是move脚本");}//每一帧都会调用一次,帧和电脑性能有关// Update is called once per framevoid Update(){//Debug.Log("Update");}//Update每次执行完都会跟着执行一次private void LateUpdate(){//Debug.Log("LateUpdate");}//和帧无关,每隔固定的时间间隔都会运行一次,默认每隔0.02秒执行一次//在unity界面上边菜单栏里  编辑——》 项目设置 ——》 时间 ——》 固定时间步进private void FixedUpdate(){//Debug.Log("FixedUpdate");}//非激活状态下调用一次,和OnEnable是相对的关系private void OnDisable(){Debug.Log("OnDisable");}//当组件销毁的时候被调用,比如进行移除组件操作,要死了写遗书private void OnDestroy(){Debug.Log("OnDestroy");}
}

四、组件的执行顺序问题

通过组件的生命周期函数我们知道了8个方法在什么情况下会执行以及执行的顺序,那么组件与组件之间的执行顺序呢?   这是我们通过设置脚本执行顺序来控制的

我们再来创建一个脚本组件test,分别在Start方法里Log输出一下我是test脚本  和  我是Move脚本

然后把这两个组件挂载在同一个实体上,然后对执行顺序进行设置。

 我们打印输出一下:设置的数值越小就越先执行

好了,到此本篇博客知识点全部讲完了,拜拜┏(^0^)┛ 

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

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

相关文章

简单了解SQL宽字节注入与httpXFF头注入(基于sqllabs演示)

1、宽字节注入 sqllabs-less-32为例 使用单引号进行测试 提示我们输入的单引号被转义符 \ 进行了转义,即转义符自动的出现在输入的特殊字符前面,这是防止sql注入的一种方法,导致无法产生报错。 这种情况我们就可以尝试宽字节注入&#xff…

PLC电机正反转控制程序示例

一、对于三相电源线的电动机,反转只需要任意的交换两根电源线即可 二、例如接通KM1对应正转的话,则接通KM2则对应反转 三、电机正转按钮及其对应的地址 四、电机反转按钮及其对应的地址 五、电机停止按钮及其对应的地址 六、正转的接触器线圈 七、反转的…

2023年终总结

前言: 嘻嘻,12月底广州降温了又到了写年终总结的时间,这也是我第二年写年终总结。今年的年终总结主要记录了我大三下学期和大四上学期这两个时间段的学习和收获,也是我尝试走出校园,接触社会的第一年(感触…

【MySQL】数据库之小题练习(完全备份和增量备份的数据恢复,以及断点恢复)

目录 先创建库,创建表,完成三次数据的录入以及第一次的完全备份,第二次和第三次的增量备份; 第一次完全备份操作 第二次插入后做增量备份操作 第三次 插入后做增量备份操作 1、完全备份恢复,获取一班的人的成绩 …

【人工智能新闻】2023年人工智能热门新闻

欢迎收看我们的特别版时事通讯,重点报道“2023年人工智能热门新闻”今年是人工智能领域的里程碑,展示了重塑技术和我们日常生活的突破性进步和创新。从大型企业投资到革命性的技术发布,2023年的每个月都带来了非凡的成就。 加入我们&#xf…

Spring 是如何解决循环依赖的

1.什么是循环依赖? 所谓的循环依赖是指,A 依赖 B,B 又依赖 A,它们之间形成了循环依赖。或者是 A 依赖 B,B 依赖 C,C 又依赖 A。它们之间的依赖关系如下: 2.通过手写代码演示理解Spring循环依赖 DEMO: pu…

ssm基于冲突动态监测算法的健身房预约系统的设计与实现论文

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装健身房预约系统软件来发挥其高效地信息处理的作用&#xff…

正确的认识 字节码文件

上一篇中认识了JVM的基本组成,我们说JVM只认识字节码文件。那么在字节码文件进入JVM之前,我们先认识了解字节码文件长什么样,我们作为工程师不需要去死扣底层的理论知识,但是我们只是需要正确的打开字节码文件 知道里面有哪些部分…

OpenCV(Python)基础—9小时入门版

OpenCV(Python)基础—9小时入门版 # # Author : Mikigo # Time : 2021/12/1 # 一、一句话简介 OpenCV (Open Source Computer Vision Library) 是用 C 语言编写,提供 Python、Java 等语言 API的一个开源计算机视觉库。 二、安装 1、Debian 系使用 apt 安装 O…

基于JAVA的考研专业课程管理系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 考研高校模块2.3 高校教师管理模块2.4 考研专业模块2.5 考研政策模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 考研高校表3.2.2 高校教师表3.2.3 考研专业表3.2.4 考研政策表 四、系统展示五、核…

PostgreSQL10数据库源码安装及plpython2u、uuid-ossp插件安装

PostgreSQL10数据库源码安装及plpython2u、uuid-ossp插件安装 1、环境2、安装包下载3、安装3.1 、解压3.2、配置3.3、编译安装3.4 、启动与关闭 4、安装 uuid-ossp 、plpython2u插件5、参考 1、环境 centos 7 、 postgresql 10.19 2、安装包下载 postgres 源码安装包 3、安…

平凯数据库亮相 2023 信息技术应用创新论坛

11 月 25 日,2023 信息技术应用创新论坛在常州开幕。江苏省工业和信息化厅副厅长池宇、中国电子工业标准化技术协会理事长胡燕、常州市常务副市长李林等领导出席论坛并致辞。中国工程院院士郑纬民出席并作主题报告。来自产学研用金等各界的千余名代表参加本次论坛。…