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 update
    void Start()
    {
       
    }

    // Update is called once per frame
    void 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 update
    void Start()
    {
        Debug.Log("Start");
        //Debug.Log("我是move脚本");
    }

    //每一帧都会调用一次,帧和电脑性能有关
    // Update is called once per frame
    void 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^)┛ 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux go环境安装 swag

下载依赖包 go get -u github.com/swaggo/swag编译 移动到下载的go-swagger包目录,一般在$GOPATH/pkg/mod下 查看 GOPATH echo $GOPATHcd /root/GolangProjects/pkg/mod/github.com/swaggo/swagv1.16.2go install ./cmd/swag/不出意外,$GOPATH/bin下 已经有了sw…

记一次redis内存没满发生key逐出的情况。

现象: 从监控上看,redis的内存使用率最大是80%,但是发生了key evicted 分析: 原因1、可能是阿里云监控没抓取到内存100%监控数据。 阿里控制台监控监控粒度是5秒。 内存使用率的计算方法。 used_memory_human/maxmemory 原因2、…

使用uni-app editor富文本组件设置富文本内容及解决@Ready先于onload执行,无法获取后端接口数据的问题

开始使用富文本组件editor时,不知如何调用相关API设置富文本内容和获取内容,本文将举例详解 目录 一.了解editor组件的常用属性及相关API 1.属性常用说明 2.富文本相关API说明 1)editorContext 2) editorContext.setContents…

大数据爱好者福音:Kudu框架学习网站,助你一臂之力!

介绍:Kudu是由Cloudera开源的列式存储引擎,专为处理大数据而设计。它是为了解决Hadoop生态系统中的一些挑战而被引入的,如流式实时计算结果的更新和时间序列相关应用等需求。 Kudu具有几个显著的特点:首先,它是用C语言…

【AI导师】利用Coding Agent完成AIGC编程

利用Coding Agent完成AIGC编程 一、前言二、Coding Agent三、1024code四、AI导师README项目初版功能定义代码结构设计方案函数方法设计方案迭代记录 一、前言 AI产品的发展确实在过去两年年中取得了显著进展,尤其是在编程领域。一开始,ChatGPT和类似的语…

Zookeeper-Zookeeper应用场景实战(二)

1. Zookeeper 分布式锁实战 1.1 什么是分布式锁 在单体的应用开发场景中涉及并发同步的时候,大家往往采用Synchronized(同步)或者其他同一个 JVM内Lock机制来解决多线程间的同步问题。在分布式集群工作的开发场景中,就需要 一种…

前端大屏适配几种方案

记录一下前端大屏的几种适配方案。 我们是1920*1080的设计稿。 目录 目录 一、方案一:remfont-size 二、方案二:vw(单位) 三、方案三:scale(缩放)强烈推荐 1、根据宽度比率进行缩放 2、动…

十大排序算法归纳

目录 排序算法的分类 插入排序算法模板 选择排序算法模板 冒泡排序算法模板 希尔排序算法模板 快速排序算法模板 归并排序算法模板 堆排序算法模板 基数排序算法模板 计算排序算法模板 桶排序算法模板 排序算法的分类 插入:插入,折半插入&am…

Springcloud Alibaba使用Canal将Mysql数据实时同步到Redis保证缓存的一致性

目录 1. 背景 2. Windows系统安装canal 3.Mysql准备工作 4. 公共依赖包 5. Redis缓存设计 6. mall-canal-service 1. 背景 canal [kənl] ,译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。其诞…

八个理由:从java8升级到Java17

目录 前言 1. 局部变量类型推断 2.switch表达式 3.文本块 4.Records 5.模式匹配instanceof 6. 密封类 7. HttpClient 8.性能和内存管理能力提高 前言 从Java 8 到 Java 20,Java 已经走过了漫长的道路,自 Java 8 以来,Java 生态系统…

软件工程PPT 笔记摘录(2)

分析软件需求 UML 提供了用例图来分析和描述用例视角的软件需求模型 UML 提供了交互图和状态图来描述行为视角的软件需求模型 UML 提供了类图来描述和分析业务领域的概念模型 顺序图:强调消息传递的时间序 通信图:突出对象间的合作 类图&#xff0…

vscode调试 反汇编c/c++ 查看汇编代码gdb/lldb

先看下流程! 先看下流程! 有问题请留言! 文章目录 必备F5开启调试左侧侧边栏->确保打开回调栈右键函数栈->查看反汇编 方法二:手动输入命令查看 必备 使用c/c 插件,这应该是必备的。 F5开启调试 左侧侧边栏-&…

【Leetcode】1154. 一年中的第几天

文章目录 题目思路代码 题目 1154. 一年中的第几天链接 思路 题目要求是给定一个字符串 date,它代表一个日期,采用标准的 YYYY-MM-DD 格式。需要计算这个日期是当年的第几天。 首先,我们可以通过字符串的索引来提取年、月和日的数值&…

C语言实验5:结构体

目录 一、实验要求 二、实验原理 1. 普通结构体 1.1 显示声明结构体变量 1.2 直接声明结构体变量 ​编辑 1.3 typedef在结构体中的作用 2. 结构体的嵌套 3. 结构体数组 4. 指向结构体的指针 4.1 静态分配 4.2 动态分配 三、实验内容 1. 学生数据库 代码 截图 …

穿越时光的镜头:2023回顾与2024展望

前言 2023 年就像一本充满着惊喜和挑战的书籍,它的每一页都留下了我生活中不同的痕迹。回顾过去,我发现了许多意想不到的成长和启示,也体验了生活的起起伏伏。 这篇文章是对 2023 年的一个小小总结,也是对未来的一点期许。在这里…

PAT 乙级 1046 划拳

划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就赢了,输家罚一杯酒。两人同赢或两人同输则继续下一轮&…

Unity中URP下精度修饰符real

文章目录 前言一、real是什么?1、我们在项目的Packages下找到如下文件:2、HAS_HALF(1代表有half精度,0代表没有half精度)3、PREFER_HALF4、REAL_IS_HALF5、如果 real is half6、否则为float 二、总结 前言 在使用雾效时,ComputeFo…

Git使用教程 gittutorial

该教程对该文章的翻译:https://git-scm.com/docs/gittutorial 本文介绍怎用使用 Git 导入新的工程、修改文件及如何其他人同步开发。 首先, 可以使用以下指令获取文档帮助 git help log笔者注:不建议看这个文档,标准的语法介绍…

Lesson 06 vector类(上)

C:渴望力量吗,少年? 文章目录 一、vector是什么?二、vector的使用1. 构造函数2. vector iterator3. vector 空间增长问题4. vector增删查改 三、vector实际使用 一、vector是什么? vector是表示可变大小数组的序列容器…

条款13:以对象管理资源

文章目录 没有管理的情况解决办法之unique_ptr智能指针解决办法之shared_ptr智能指针总结 没有管理的情况 资源是指一旦你使用完它,就需要返回系统的东西。 class Investment { ... }; // 投资类型层次结构的基类 Investment* createInvestment(); // 工厂函数&…