当前位置: 首页 > news >正文

Unity-生命周期函数

目录

生命周期函数是什么?

生命周期函数有哪些?

Awake()

OnEnable()

Start()

FixedUpdate()

Update()

Late Update()

OnDisable()

OnDestroy()

Unity中生命周期函数支持继承多态吗?


生命周期函数是什么?

在Unity中,生命周期函数(Lifecycle Function)是指一组特定的函数,它们会在游戏对象或脚本组件的生命周期中被自动调用。这些函数可以让我们在游戏运行的不同阶段做出相应的响应和处理,例如初始化、更新、销毁等。

生命周期函数有哪些?

下面是一些常见的生命周期函数及其作用:

1. `Awake()`:该函数在游戏对象或脚本组件被创建时调用,用于进行初始化操作。通常在该函数中获取组件引用、设置默认值等。

2.`OnEnable()`:该函数用于在对象被启用时执行。具体来说,当一个脚本组件被添加到一个游戏对象上,或者该游戏对象被激活时,都会触发该组件的OnEnable函数。

3. `Start()`:该函数在游戏对象或脚本组件第一次被启用时调用,用于进行一些初始化操作。通常在该函数中进行游戏开始前的准备工作、设置初始状态等。

4. `FixedUpdate()`:该函数在一定时间间隔后(通常为0.02秒)调用,用于更新游戏对象或脚本组件的物理属性。通常在该函数中进行物理模拟、刚体操作等。

5. `Update()`:该函数在每一帧更新时调用,用于更新游戏对象或脚本组件的状态。通常在该函数中进行游戏逻辑的处理、数据的更新等。

6.LateUpdate():LateUpdate()是一个生命周期函数,它在Update()函数之后被调用,用于在Update()函数执行完毕后更新游戏对象的逻辑和状态。

6. `OnDisable()`:在Unity中,OnDisable() 是游戏对象的生命周期函数之一,用于处理对象失活时的逻辑。当游戏对象失活时,Unity会自动调用 OnDisable() 函数。

7. `OnDestroy()`:该函数在游戏对象或脚本组件被销毁时调用,用于进行资源释放、清理等。通常在该函数中释放内存、关闭文件句柄等。

生命周期函数让我们可以方便地在游戏运行的不同阶段进行处理和响应,从而实现更加灵活的游戏逻辑。需要注意的是,如果我们不继承自MonoBehaviour类,则无法使用Unity的生命周期函数。

还有,生命周期函数一般被定义为protected或private,而不是public。

Awake()

关键字:初始化

当对象(自己这个类对象被创建时),才会调用该周期函数。

具体来说,当你在Unity中创建一个新的对象,例如一个游戏物体或是一个脚本挂载的组件,该对象会在内存中被实例化。在实例化过程中,对象的构造函数会被调用,然后在构造函数之后,Awake()函数会被自动调用。

Awake()函数的作用是在对象被创建后,但在场景中启用和激活之前进行必要的初始化和设置。可以在Awake()函数中执行一些需要提前完成的操作,例如变量的初始化、注册事件监听器、获取其他组件的引用等。这样,在Start()函数和Update()函数等后续的生命周期函数中,就可以使用已经初始化好的数据了。

总结起来,Awake()函数是用来在对象被创建时进行初始化的生命周期函数,它在构造函数之后被调用,用于准备对象在场景中使用所需的数据和状态。

OnEnable()

关键字:激活

在Unity游戏引擎中,OnEnable()是一个生命周期函数,用于在对象被启用时执行特定的操作。

当一个对象从非激活状态变为激活状态时(例如,在对象被创建、场景加载、禁用后重新启用等情况下),Unity会自动调用OnEnable()函数。

当一个对象被启用时,它会先调用Awake()函数进行初始化,然后调用OnEnable()函数进行进一步的准备工作。

通常,OnEnable()函数用于注册事件监听器、进行资源加载、启动协程、打开文件或网络连接等需要在对象激活时进行的操作。

与Awake()函数不同,OnEnable()函数每次对象激活时都会被调用,可以用来处理需要在对象每次激活时执行的逻辑。这样,在对象被禁用再重新启用时,可以确保所需的操作得到正确执行。

需要注意的是,OnEnable()函数在对象第一次被创建时也会被调用,因此在编写代码时应该注意处理好初始化和重复执行的逻辑。

总结,OnEnable()是Unity中的一个生命周期函数,用于在对象被启用时进行特定的操作。它可以用来执行在对象激活时需要执行的逻辑,如注册事件、加载资源等。

Start()

关键字:一次

Start()是一个生命周期函数,用于在对象被启用后的第一次帧开始时执行初始化操作。一个对象只能调用一次

当对象被启用后,首先会调用Awake()函数进行基本的初始化,然后在下一帧开始时调用Start()函数,进行进一步的初始化操作。

通常,我们将在Start()函数中进行一些需要在对象第一次启动时进行的操作,例如设置初始状态、初始化变量、获取其他组件的引用等。

Start()函数只在对象第一次启动时被调用,它不会被再次触发。这意味着,在对象重新激活时(例如场景切换回来或对象被禁用再启用),Start()函数不会再次执行。如果需要每次对象激活时都执行一些逻辑,应该使用OnEnable()函数。

需要注意的是,Start()函数的执行顺序是根据对象在场景中的顺序决定的。如果存在多个对象挂载了相同的脚本,并且这些对象在场景中的顺序不同,它们的Start()函数将按照场景中的顺序依次执行。

总结起来,Start()是Unity中的一个生命周期函数,用于在对象被激活后的第一帧开始时进行初始化操作。它用于执行需要在对象第一次启动时进行的逻辑,只会在对象第一次激活时被调用。

Start()和OnEnable()是Unity中常用的两个生命周期函数,它们在对象激活时分别执行不同的操作,有以下区别和联系:

1. 触发时机:
   - Start():在对象第一次被激活后的下一帧开始时调用,只会执行一次。
   - OnEnable():在对象被启用时调用,包括对象第一次被创建、场景加载、禁用后重新启用等情况,每次对象激活时都会被调用。

2. 执行顺序:
   - Start():根据对象在场景中的顺序决定执行顺序。如果存在多个对象挂载了相同的脚本,并且这些对象在场景中的顺序不同,它们的Start()函数将按照场景中的顺序依次执行。
   - OnEnable():按照对象被启用的顺序依次执行。通常情况下,与对象在场景中的顺序无关。

3. 功能:
   - Start():用于进行对象的初始化操作,例如设置初始状态、初始化变量、获取其他组件的引用等。适合处理在对象第一次启动时需要执行的逻辑。
   - OnEnable():用于在对象每次激活时执行特定的操作,例如注册事件监听器、进行资源加载、启动协程、打开文件或网络连接等。适合处理需要在对象激活时执行的逻辑。

需要注意的是,如果对象在Awake()函数中被禁用了,那么在对象重新启用时,只会调用OnEnable()函数而不会调用Start()函数。因此,如果需要确保在对象第一次启用和每次启用时都执行一些逻辑,应该将相应的代码放在OnEnable()函数中。

FixedUpdate()

关键字:物理

在Unity中,FixedUpdate()是一个生命周期函数,用于在固定的时间间隔(可以在project setting-Time里)内执行物理相关的更新操作。它会在每一帧渲染之前被调用,而不受帧率的影响。因此,FixedUpdate()适用于需要与物理引擎交互或进行精确计算的场景。

Update()

关键字:更新

在Unity中,Update()是一个常用的生命周期函数,它会在每一帧中被调用,用于更新游戏对象的核心逻辑和状态。

1. 触发时机:
   Update()函数在每一帧渲染之前被调用,因此它的执行频率与帧率相关。默认情况下,每秒调用次数与当前帧率一致,即每秒60次(或其他帧率)。

2. 功能:
   - 游戏逻辑更新:Update()函数是实现游戏逻辑的主要场所。例如,处理玩家输入、移动游戏对象、检测碰撞、进行游戏状态切换等都可以放在Update()函数中。
   - 动画更新:如果游戏对象具有动画组件,Update()函数也可以用于更新动画状态。通过修改动画的播放速度、切换动画片段等操作来控制动画的播放。

3. 注意事项:
   - 避免在Update()中使用过多的计算,以防止性能问题。如果需要进行复杂的计算,可以考虑将计算操作放在FixedUpdate()函数中,以固定时间间隔执行。
   - 对于需要在固定间隔内执行的物理相关操作,应该使用FixedUpdate()而不是Update()函数。

总结起来,Update()是Unity中的一个生命周期函数,用于在每一帧中更新游戏对象的逻辑和状态。它适用于处理游戏逻辑、玩家输入、移动游戏对象、检测碰撞等操作。需要注意避免过多的计算,并对于物理相关操作应该使用FixedUpdate()函数。

Late Update()

关键字:摄像机

在Unity中,LateUpdate()是一个生命周期函数,它在Update()函数之后被调用,用于在Update()函数执行完毕后更新游戏对象的逻辑和状态。

1. 触发时机:
   LateUpdate()函数在每一帧渲染之后被调用,因此它会在所有Update()函数执行完毕后执行。这样可以确保在更新游戏对象之前,所有的Update()函数都已经执行完毕。

2. 功能:
  跟随相机:如果游戏对象需要跟随相机移动,可以将跟随相机的代码放在LateUpdate()中执行。这样可以确保相机移动后游戏对象的位置也更新了。

总结起来,LateUpdate()是Unity中的一个生命周期函数,它在Update()函数之后被调用,用于在Update()函数执行完毕后更新游戏对象的逻辑和状态。它适用于进行碰撞检测、跟随相机等操作。

FixedUpdate()、Update()、Late Update()都是会不停地被调用的帧循环函数这些帧循环函数通过按照固定的顺序被调用,使得游戏对象能够在每一帧中更新并保持正确的状态。

OnDisable()

关键字:失活

在Unity中,OnDisable() 是游戏对象的生命周期函数之一,用于处理对象失活时的逻辑。每次对象失活时,Unity都会自动调用 OnDisable() 函数。

OnDestroy()

关键字:销毁

OnDestroy() 是游戏对象的生命周期函数之一,用于处理对象即将销毁时的逻辑。当游戏对象被销毁删除时,Unity会自动调用 OnDestroy() 函数。

OnDestroy() 函数常用于以下情况:
1. 清理资源:在游戏对象即将销毁时,可以使用 OnDestroy() 函数释放或清理该对象使用的资源。这包括关闭文件句柄、取消订阅事件、销毁其他对象的引用等。通过在 OnDestroy() 中进行资源清理,可以确保在对象销毁时不会出现资源泄漏或无效引用。

2. 停止协程和计时器:如果在游戏对象上启动了协程或计时器,需要在对象销毁时停止它们的执行。可以在 OnDestroy() 中调用 StopCoroutine() 或 CancelInvoke() 来停止协程或计时器,以避免在对象销毁后仍然执行相关代码。

3. 取消注册监听器:如果游戏对象注册了监听器(例如事件监听器、输入监听器等),可以在 OnDestroy() 中取消注册以避免对象销毁后仍然接收到事件或输入。这是为了确保对象在销毁状态下不会响应或处理任何事件。

需要注意的是,OnDestroy() 在对象被销毁时会被调用,但当对象再次创建时并不会自动调用任何生命周期函数。如果需要在对象重新创建时执行特定的逻辑,可以使用 Awake() 或 Start() 函数。

总之,OnDestroy() 是 Unity 中一个重要的生命周期函数,用于在游戏对象即将销毁时处理资源释放、协程停止和监听器取消注册等操作。它是确保对象在销毁前执行必要清理的关键函数。

Awake()、Start()、OnDestroy()都是只会调用一次的函数。

FixedUpdate()、Update()、Late Update()都是会不停地被调用的帧循环函数

OnEnable()、OnDisable()是激活/失活的时候都会被调用。

Unity中生命周期函数支持继承多态吗?

在Unity中,生命周期函数(如Awake()、Start()、Update()等)是通过组件脚本来实现的,而组件脚本是可以继承的。因此,生命周期函数在继承关系中也会支持多态性。

当一个游戏对象上添加了多个组件脚本时,每个组件都可以重写生命周期函数。

如果子类重写了父类的生命周期函数,那么在运行时,Unity会根据组件的实际类型调用正确的生命周期函数。

例如,如果一个游戏对象上有一个父类组件脚本和一个子类组件脚本,并且它们都重写了 Start() 函数,那么在游戏对象启动时,Unity会首先调用子类组件的 Start() 函数,然后再调用父类组件的 Start() 函数。

这种继承多态的特性使得在Unity中可以方便地实现组件的复用和定制化。你可以在子类中添加特定的逻辑,同时保留父类的共同功能。通过重写生命周期函数,你可以自定义游戏对象的行为,并根据实际需求进行灵活的扩展和定制。

相关文章:

Unity-生命周期函数

目录 生命周期函数是什么? 生命周期函数有哪些? Awake() OnEnable() Start() FixedUpdate() Update() Late Update() OnDisable() OnDestroy() Unity中生命周期函数支持继承多态吗? 生命周期函数是什么? 在Unity中&…...

SQL概述及SQL分类

SQL由IBM上世纪70年代开发出来,是使用关系模型的数据库应用型语言,与数据直接打交道。 SQL标准 SQL92,SQL99,他们分别代表了92年和99年颁布的SQL标准,我们今天使用的SQL语言依旧遵循这些标准。 SQL的分类 DDL:数据定…...

[VSCode] VSCode 常用快捷键

文章目录 VSCode 源代码编辑器VSCode 常用快捷键分类汇总01 编辑02 导航03 调试04 其他05 重构06 测试07 扩展08 选择09 搜索10 书签11 多光标12 代码片段13 其他 VSCode 源代码编辑器 官网:https://code.visualstudio.com/ 下载地址:https://code.visua…...

函数指针和回调函数 以及指针函数

函数指针(Function Pointer): 定义: 函数指针是指向函数的指针,它存储了函数的地址。函数的二制制代码存放在内存四区中的代码段,函数的地址它在内存中的开始地址。如果把函数的地址作为参数,就…...

京东年度数据报告-2023全年度游戏本十大热门品牌销量(销额)榜单

同笔记本市场类似,2023年度游戏本市场的整体销售也呈下滑态势。根据鲸参谋电商数据分析平台的相关数据显示,京东平台上游戏本的年度销量累计超过350万,同比下滑约6%;销售额将近270亿,同比下滑约11%。 鲸参谋综合了京东…...

秒懂百科,C++如此简单丨第十二天:ASCLL码

目录 必看信息 Everyday English 📝ASCLL码是什么? 📝ASCLL码表 📝利用ASCLL码实现大写转小写 📝小试牛刀 总结 必看信息 ▶本篇文章由爱编程的小芒果原创,未经许可,严禁转载。 ▶本篇文…...

Qt6入门教程 4:Qt Creator常用技巧

在上一篇Qt6入门教程 3:创建Hello World项目中,通过创建一个Qt项目,对Qt Creator已经有了比较直观的认识,本文将介绍它的一些常用技巧。 Qt Creator启动后默认显示欢迎页面 创建项目已经用过了,打开项目也很简单&#…...

阴盘奇门八字排盘马星位置计算方法php代码

如下位置,马星的四个位置。 计算方法: 1。先根据出生年月日,计算得八字四柱。比如 2024年01月09日,四柱为 其中时柱地支为“申” 2。然后根据以下对应的数组,来找到id号,即马星位置。 根据下表来找到&am…...

vue3 使用 jsoneditor

vue3 使用 jsoneditor 在main.js中引入 样式文件 import jsoneditor/dist/jsoneditor.css复制代码放到文件中就能用了 jsoneditor.vue <template><div ref"jsonDom" style"width: 100%; height: 460px"></div> </template> <…...

若依前后端分离版使用mybatis-plus实践教程

1、根目录得pom加入依赖 <properties><mybatis-plus.version>3.5.1</mybatis-plus.version> </properties> <dependencies><!-- mp配置--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus…...

SpringBoot-Dubbo-Zookeeper

Apache Dubbo&#xff1a;https://cn.dubbo.apache.org/zh-cn/overview/home/ 依赖 <!--dubbo--> <dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>2.7.3</versio…...

华为HCIE课堂笔记第十二章 ICMPv6和NDP协议

第十二章 ICMPv6和NDP 12.1 背景 ICMPv6协议用于IPV6协议的消息传递&#xff1a;地址解析、重复地址检测、无状态地址配置、NDP协议、路径MTU发现。 12.2 ICMPv6介绍 ICMPv6的头部字段包含Type字段、Code字段、校验和字段。 消息分为两种&#xff1a; 查错消息&#xff…...

GNSS科研常用相关网站及资源

代码类&#xff1a; Github GitHub: Let’s build from here GitHub 导航相关开源项目 GNSS&#xff1a;RTKLIB、GAMP II-GOOD、GPSTest、GNSSLogger 组合导航&#xff1a;ignav、VINS、Multi_Sensor_Fusion Gitee&#xff08;从Github导入后快速下载库&#xff09; Gi…...

进程的创建与回收学习笔记

目录 一、进程内容&#xff1a; 二、进程常用命令 三、创建子进程 四、子进程进阶 五、进程的退出 六、进程的回收 一、进程内容&#xff1a; 程序&#xff1a; 存放在磁盘上的指令和数据的有序集合&#xff08;文件&#xff09; 静态的 进程&#xff1a; 执行一个程序所…...

【CCNet】《CCNet:Criss-Cross Attention for Semantic Segmentation》

ICCV-2019 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method5 Experiments5.1 Datasets and Metrics5.2 Experiments on Cityscapess5.3 Experiments on ADE20K5.4 Experiments on COCO 6 Conclusion&#xff08;own&#xff09; 1 Ba…...

Qt QSQlite数据库插入字符串中存在单个双引号或单个单引号解决方案

1. 前言 当进行数据库写入或更新时&#xff0c;有时会遇到存在字符串中包含单个双引号或者单引号。 2. 单引号和双引号""作用 在数据库中&#xff0c;字符串常量时需要用一对英文单引号或英文双引号""将字符串常量括起来。 比如&#xff1a; select * …...

Linux系统中的IP地址、主机名、和域名解析

1.IP地址 每一台联网的电脑都会有一个地址&#xff0c;用于和其它计算机进行通讯 IP地址主要有2个版本&#xff0c;V4版本和V6版本&#xff08;V6很少用&#xff0c;暂不涉及&#xff09; IPv4版本的地址格式是&#xff1a;a.b.c.d&#xff0c;其中abcd表示0~255的数字&…...

soc算法【周末总结】

1 实验一&#xff08;SOC误差30%放电实验&#xff09; 1.1 实验过程 1、对电池包进行充电&#xff0c;将昨天放空的电池包进行充电&#xff0c;充电至SOC40%左右&#xff1b; 2、电池包SOC为38%时&#xff0c;手动修改SOC值为70%&#xff0c;开始放电 3、SOC由70%缓慢降至4…...

SpringBoot之优化高并发场景下的HttpClient并提升QPS

HttpClient优化思路 使用连接池&#xff08;简单粗暴&#xff09; 长连接优化&#xff08;特殊业务场景&#xff09; httpclient和httpget复用 合理的配置参数&#xff08;最大并发请求数&#xff0c;各种超时时间&#xff0c;重试次数&#xff09; 异步请求优化&#xff0…...

go-zero 如何在任意地方获取yaml中的值

1、config配置文件中新增全局变量 package configimport "github.com/zeromicro/go-zero/rest"type Config struct {rest.RestConfDB struct {DataSource string}Redis struct {Addr stringPassWord stringUserName string}Auth struct {AccessSecret stringAcc…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...

Modbus RTU与Modbus TCP详解指南

目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...