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: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协议的消息传递:地址解析、重复地址检测、无状态地址配置、NDP协议、路径MTU发现。 12.2 ICMPv6介绍 ICMPv6的头部字段包含Type字段、Code字段、校验和字段。 消息分为两种: 查错消息ÿ…...

GNSS科研常用相关网站及资源
代码类: Github GitHub: Let’s build from here GitHub 导航相关开源项目 GNSS:RTKLIB、GAMP II-GOOD、GPSTest、GNSSLogger 组合导航:ignav、VINS、Multi_Sensor_Fusion Gitee(从Github导入后快速下载库) Gi…...

进程的创建与回收学习笔记
目录 一、进程内容: 二、进程常用命令 三、创建子进程 四、子进程进阶 五、进程的退出 六、进程的回收 一、进程内容: 程序: 存放在磁盘上的指令和数据的有序集合(文件) 静态的 进程: 执行一个程序所…...

【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(own) 1 Ba…...

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

Linux系统中的IP地址、主机名、和域名解析
1.IP地址 每一台联网的电脑都会有一个地址,用于和其它计算机进行通讯 IP地址主要有2个版本,V4版本和V6版本(V6很少用,暂不涉及) IPv4版本的地址格式是:a.b.c.d,其中abcd表示0~255的数字&…...

soc算法【周末总结】
1 实验一(SOC误差30%放电实验) 1.1 实验过程 1、对电池包进行充电,将昨天放空的电池包进行充电,充电至SOC40%左右; 2、电池包SOC为38%时,手动修改SOC值为70%,开始放电 3、SOC由70%缓慢降至4…...

SpringBoot之优化高并发场景下的HttpClient并提升QPS
HttpClient优化思路 使用连接池(简单粗暴) 长连接优化(特殊业务场景) httpclient和httpget复用 合理的配置参数(最大并发请求数,各种超时时间,重试次数) 异步请求优化࿰…...

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…...

C++20结构化绑定应用实例(二百五十六)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…...

改进YOLOv8注意力系列四:结合中心化特征金字塔EVCBlock、大核卷积注意力LKA_Attention、全局注意力MobileViTAttention
改进YOLOv8注意力系列三:结合CrissCrossAttention、ECAAttention、EMAU期望最大化注意力 代码大核卷积注意力LKA_Attention中心化特征金字塔EVCBlock全局注意力MobileViTAttention加入方法各种yaml加入结构本文提供了改进 YOLOv8注意力系列包含不同的注意力机制以及多种加入方…...

idea中使用Lombok 失效,@Slf4j 找不到符号的解决办法
文章目录 一、前言二、问题排查和解决方案三、 其他解决方案3.1 另一种解决方案3.2 参考文章 一、前言 今天在一个多module工程中,新增了一个 springboot(版本 2.2.4.RELEASE) module,像往常一样,我引入了lombok依赖&…...

MySQL修炼手册8:约束与完整性:保证数据的一致性
目录 写在开头1 主键与唯一键约束1.1 PRIMARY KEY约束的作用1.2 主键的复合使用1.3 主键的修改与删除1.4 UNIQUE约束的应用场景1.5 主键与唯一键约束的性能影响1.6 主键的自动增长1.7 主键的最佳实践1.8 独特性与业务需求1.9 避免过度使用唯一约束1.10 主键与唯一键的关系 2 外…...

React入门 - 03(初识 React 组件和 JSX)
本章内容 目录 1.初识 React 组件2.关于 JSX 继上一节的工程案例,我们这一节主要了解一下 React组件和 “JSX 语法”。 前置知识点:ES6模块化&继承 1.初识 React 组件 1、打开 src/index.js文件(项目的入口文件)内容&…...

华为OD机试 - 反射计数(Java JS Python C)
题目描述 给定一个包含 0 和 1 的二维矩阵。 给定一个初始位置和速度,一个物体从给定的初始位置出发,在给定的速度下进行移动,遇到矩阵的边缘则发生镜面发射。 无论物体经过 0 还是 1,都不影响其速度。 请计算并给出经过 t 时间单位后,物体经过 1 点的次数。 矩阵以左…...

Linux系统中使用systemctl命令控制软件的启动和关闭
Linux系统很多软件(内置或第三方)均支持使用systemctl命令控制:启动、停止、开机自启 能够被systemctl管理的软件,一般也称之为:服务 1.功能和语法 功能:控制系统服务的启动关闭等 语法:syst…...

2024年01月微软更新Bug 已解决 !Explorer.EXE 提示:Windows无法访问指定设备、路径或文件。你可能没有适当的权限访问该项目。
前倾概要 近期大量出现如上图问题,杀毒,系统急救箱都没反应,罪魁祸首就是微软更新! 点击什么都是:Windows无法访问指定设备、路径或文件。你可能没有适当的权限访问该项目。 但软件使用正常,还能通过建立…...

Qt/QML编程学习之心得:slider(34)
滑条slider,有时也成为进度条progressbar,在GUI界面中也是经常用到的。 import QtQuick 2.9 import QtQuick.Controls 2.0 import QtQuick.Layouts 1.2ApplicationWindow {id:rootvisible: truewidth: 1920height: 720//title: qsTr("Hello World&q…...

使用metricbeat 监控多ES集群
背景 ES 本身自带 监控,属于xpack 中的内容,为商业版,需要收费; 并且 monitor 功能必须要在security开启后才能使用,还有就是集群监控自己,将采集到的性能数据保存到本集群,这是一个比较差的设…...