Unity生命周期函数解析
本文由 简悦 SimpRead 转码, 原文地址 mp.weixin.qq.com
Unity生命周期函数解析
Unity 生命周期函数是在游戏对象的不同阶段被调用的方法,通过这些函数,我们可以在不同的时刻执行特定的代码。在这篇文章中,我们将一步步解析 Unity 生命周期函数,分为不同阶段来理解它们的作用。
事件函数的执行顺序 - Unity 手册 (unity3d.com)
1. 初始化阶段 Initialization
- Awake(唤醒)
始终在任何 Start 函数之前并在实例化预制件之后调用此函数。(如果游戏对象在启动期间处于非活动状态,则在激活之后才会调用 Awake。)
- OnEnable(当可用)
(仅在对象处于激活状态时调用)在启用对象后立即调用此函数。在创建 MonoBehaviour 实例时(例如加载关卡或实例化具有脚本组件的游戏对象时)会执行此调用。
- Reset(重置)(Editor)
调用 Reset 可以在脚本首次附加到对象时以及使用 Reset 命令时初始化脚本的属性。
- Start(开始)
在对象的第一帧更新前调用,常用于初始化游戏对象之间的引用关系等操作。
仅当启用脚本实例后,才会在第一次帧更新之前调用 Start。
2. 物理阶段Physics
- FixedUpdate(固定更新)
在固定的物理时间间隔内调用,适合处理物理相关的逻辑,如移动、碰撞检测等。调用 FixedUpdate 的频度常常超过 Update。如果帧率很低,可以每帧调用该函数多次;如果帧率很高,可能在帧之间完全不调用该函数。在 FixedUpdate 之后将立即进行所有物理计算和更新。在 FixedUpdate 内应用运动计算时,无需将值乘以 Time.deltaTime。这是因为 FixedUpdate 的调用基于可靠的计时器(独立于帧率)。
- OnTriggerXXX(触发)
处理触发器事件,例如 OnTriggerEnter、OnTriggerStay、OnTriggerExit 等。
- OnCollisionXXX(碰撞)
处理碰撞事件,例如 OnCollisionEnter、OnCollisionStay、OnCollisionExit 等。
- yield WaitForFixedUpdate(协程:物理帧结束)
在协程中使用,等待物理帧结束后继续执行。
3. 输入事件阶段 Input events
- OnMouseXXX(输入)
处理用户输入事件,例如鼠标点击、键盘输入等。
4. 游戏逻辑阶段 Game logic
- Update(更新)
在每一帧更新时调用,用于处理游戏逻辑。每帧调用一次 Update。这是用于帧更新的主要函数。
- 判断多个协程点
在 Update 中可以判断多个协程的执行点,进行逻辑控制:yield null, yield WaitForSeconds, yield WWW, yield StartCoroutine
- 内部动画更新 Internal animation update
在 Update 中更新内部动画。
- LateUpdate(延后更新)
在 Update 之后调用,适合处理与 Update 相关的逻辑。每帧调用一次 LateUpdate__(在 Update__ 完成后)。LateUpdate 开始时,在 Update 中执行的所有计算便已完成。LateUpdate 的常见用途是跟随第三人称摄像机。如果在 Update 内让角色移动和转向,可以在 LateUpdate 中执行所有摄像机移动和旋转计算。这样可以确保角色在摄像机跟踪其位置之前已完全移动。
5. 渲染阶段
渲染阶段包括多个生命周期函数,用于处理与渲染相关的逻辑,例如特效、相机视觉效果等。以下是这些函数的解释:
- OnPreCull
在摄像机剔除场景之前调用。剔除操作将确定摄像机可以看到哪些对象。正好在进行剔除之前调用 OnPreCull。
OnPreCull 在剔除阶段(culling)之前调用,用于在相机剔除不可见物体之前执行逻辑。在这里进行的操作将在剔除阶段考虑,可以用于自定义剔除逻辑或计算视觉效果。
- OnWillRenderObject
如果对象可见,则为每个摄像机调用一次。
OnWillRenderObject 在相机渲染之前调用,用于确定是否渲染当前对象。通常在自定义渲染脚本中使用,允许我们在渲染之前执行特定的逻辑,如动态调整材质或更新纹理。
- OnBecameVisible(即将可见)
对象变为对任何摄像机可见时调用。
OnBecameVisible 当对象在相机视野中变得可见时调用。可以用于激活或处理一些与可见性相关的逻辑,例如开始播放特效或启用特殊效果。
- OnBecameInvisible(即将不可见)
对象变为对任何摄像机不可见时调用。
OnBecameInvisible 当对象在相机视野中变得不可见时调用。适用于处理不可见时的逻辑,如停止播放特效或禁用一些效果以提高性能。
- OnPreRender(即将渲染)
在摄像机开始渲染场景之前调用。
OnPreRender 在相机渲染之前调用,用于在渲染之前执行特定逻辑。在这里进行的操作将影响相机渲染的结果,可以用于修改材质、设置全局效果等。
- OnRenderObject
所有常规场景渲染完成之后调用。此时,可以使用 GL 类或 Graphics.DrawMeshNow 来绘制自定义几何形状。
OnRenderObject 在相机渲染物体时调用,通常用于自定义渲染逻辑。在这里可以执行一些与对象渲染相关的操作,例如绘制辅助几何或实现特殊的渲染效果。
- OnPostRender
在摄像机完成场景渲染后调用。
OnPostRender 在相机完成渲染后调用,用于在渲染之后执行逻辑。适用于处理与整体渲染结果相关的操作,如后期处理效果。
- OnRenderImage
在场景渲染完成后调用以允许对图像进行后处理,请参阅后期处理效果。
OnRenderImage 在相机完成渲染后,但在渲染结果被绘制到屏幕之前调用。允许对渲染结果进行后期处理,生成最终的图像效果。
- OnDrawGizmos(Gizmos 渲染)
用于在场景视图中绘制辅助图标以实现可视化。
OnDrawGizmos 用于在 Scene 视图中渲染场景的 Gizmos。适用于在编辑器中可视化调试信息,通常用于显示场景中的边界、路径、碰撞体等信息。
- GUI 渲染
处理 GUI 渲染的逻辑。
OnGUI
每帧调用多次以响应 GUI 事件。首先处理布局和重新绘制事件,然后为每个输入事件处理布局和键盘/鼠标事件。
- yield WaitForEndOfFrame(协程:帧结束)
在协程中使用,等待帧结束后继续执行。
6. 暂停阶段
- OnApplicationPause(应用暂停)
在应用暂停时调用,可用于处理暂停时的逻辑。
7. 退出阶段
- OnApplicationQuit(应用退出)
在应用退出时调用,可用于处理退出时的逻辑。
**- OnDisable(隐藏)
行为被禁用或处于非活动状态时,调用此函数。
- OnDestroy(销毁)
在对象被销毁时调用,进行资源释放等清理操作。
通过了解和合理使用这些生命周期函数,我们可以更好地掌握 Unity 中对象的生命周期,实现精确的逻辑控制和资源管理。希望这份解析能够帮助你更好地理解 Unity 生命周期函数的作用和运行顺序。
相关文章:
Unity生命周期函数解析
本文由 简悦 SimpRead 转码, 原文地址 mp.weixin.qq.com Unity生命周期函数解析 Unity 生命周期函数是在游戏对象的不同阶段被调用的方法,通过这些函数,我们可以在不同的时刻执行特定的代码。在这篇文章中,我们将一步步解析 Unit…...
【Qt】QTextEdit/QPlainTextEdit 实现 Tab 键多行缩进与反缩进
【Qt】QTextEdit/QPlainTextEdit 实现 Tab 键多行缩进与反缩进 文章目录 I - 主要原理II - 代码实现2.1 - 自定义类2.2 - 实现 Tab 缩进2.3 - 实现反缩进 III - 参考链接 I - 主要原理 由于 QTextEdit 和 QPlainTextEdit ,都无法实现多行选中缩进与反缩进ÿ…...
C++缺陷与思考
数组隐式转换为指针 size_t func(int a[10]) {return sizeof(a); }int a[100]; func(a); // 指针大小 sizeof(a); // 数组大小函数的参数看似是一个数组形式,但事实上他已经退化为指针了,也就是等价于size_t func(int* a),而数组作为参数传…...

无公网ip环境使用DS file软件远程访问内网群晖NAS中储存的文件
文章目录 1. 群晖安装Cpolar2. 创建TCP公网地址3. 远程访问群晖文件4. 固定TCP公网地址5. 固定TCP地址连接 DS file 是一个由群晖公司开发的文件管理应用程序,主要用于浏览、访问和管理存储在群晖NAS(网络附加存储)中的文件。这个应用程序具有…...
软件工程基础
本博客地址:https://security.blog.csdn.net/article/details/136446772 一. 软件工程 1、软件危机。具体表现为:软件开发进度难以预测、软件开发成本难以控制、软件功能难以满足用户期望、软件质量无法保证、软件难以维护和软件缺少适当的文档资料。 …...
alzet供应商你值得拥有
在20世纪70年代,ALZE公司研发出来一款巧妙的药物输送装置——Alzet osmotic pump。这款产品如胶囊般精致小巧,它既有胶囊的外表,也具有胶囊的作用。在Alzet osmotic pump中藏有可以装配药物溶液的空间。此款胶囊泵如同一个小投递员࿰…...

x86中的TSS与任务切换
前言 今天在学习《深入理解Linux内核》的时候,发现出现了一个新的名词TSS(Task-State Segment),这还是我第一次了解到原来x86提供了硬件级别的任务切换功能,之前以为任务切换都是操作系统实现的来着,这里也…...

打造去中心化透明储蓄罐:Solidity智能合约的又一实践
一、案例背景 传统的储蓄罐通常是由个人或家庭使用,用于存放硬币或小额纸币。然而,这样的储蓄罐缺乏透明性,用户无法实时了解储蓄情况,也无法确保资金的安全性。 通过Solidity智能合约,我们可以构建一个去中心化…...
Java Mybatis数据库面试题
Java Mybatis数据库面试题 前言1、什么是 Mybatis?2、Mybaits 的优缺点:3、SQL 注入如何防止?4、MyBatis 框架适用场合:5、MyBatis 与 Hibernate 有哪些不同?6、#{}和${}的区别是什么?7、当表中的字段名和实…...

LeetCode-第14题-最长公共前缀
1.题目描述 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 2.样例描述 3.思路描述 按字符串数组每个数组的长度,将字符串数组从小到大排序;他们的公共前缀一定小于或等于最长元素长度…...

TCP/UDP模型:2024/2/29
作业1:TCP模型 服务器端: #include <myhead.h> #define SER_IP "192.168.199.129" #define SER_PORT 8899int main(int argc, const char *argv[]) {//1.创建用于连接的套接字文件int sfdsocket(AF_INET,SOCK_STREAM,0);if(sfd-1){per…...

微信如何设置自动回复消息,提升沟通效率的?
在日常微信聊天过程中,我们可能会频繁遇到相同问题的客户提问,特别是对于从事销售工作的朋友们而言,客户添加好友后的第一句话常常为“在吗”或“你好”。当我们拥有大量好友,手动逐一回复可能会耗费大量时间。因此,自…...
PCIE的BAR空间
1.PCIe 简介 PCIe(Peripheral Component Interconnect Express)是一种高速 串行计算机扩展总线标准,主要用于连接主板上的中央处理器(CPU)和 各种外部设备,如显卡、声卡、硬盘等。PCIe 总线取代了传统的 PC…...

11.互信息-机器学习模型性能的常用的评估指标
互信息(Mutual Information)是机器学习中常用的一种评估指标,特别是在无监督学习和聚类分析中。它用于衡量两个随机变量之间的相关性或相似性。 定义 给定两个随机变量X和Y,它们的互信息I(X;Y)定义如下: 其中&…...

SpringCloud(18)之Sleuth +Zipkin链路追踪
一、Zipkin介绍 Zipkin是一个开放源代码分布式的跟踪系统,它可以帮助收集服务的时间数据,以解决微服务架构中的延迟问 题,包括数据的收集、存储、查找和展现。每个服务向zipkin报告计时数据,zipkin会根据调用关系通 过Zipkin UI…...
GVA快速使用
1. clone 代码, 使用goland打开Server目录, 使用vsc打开前端web目录,运行后端,前端 gin-vue-admin后台管理系统 - 知乎 (zhihu.com) 2.了解端口配置 参考, 基于Go的后台管理框架Gin-vue-admin_go vue admin-CSDN博客…...
Linux文本处理三剑客:awk(内置函数详解笔记)
Linux系统中,AWK 是一个非常强大的文本处理工具,它的内置函数使得对文本数据进行处理更加高效和便捷。 本文将介绍 AWK 内置函数的几种主要类型: 算数函数字符串函数时间函数位操作函数其他常用函数 我们将使用一个示例文本文件来演示这些函…...

C++调用lua函数
C 调用Lua全局变量(普通) lua_getglobal(lua, "width");int width lua_tointeger(lua,-1);lua_pop(lua,1);std::cout << width << std::endl;lua_close(lua); 这几行代码要放到lua_pcall(lua, 0,0,0);之后才可以. C给lua传递变量 lua_pushstring(lua, …...

java找工作之Mybatis(入门及xml配置相关)
Mybatis 学习Mybatis就要学会查看官网,官网地址如下:<MyBatis中文网 > 1、简介 1.1什么是Mybatis MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取…...
如何保证 HTTPS 证书的有效性?
随着互联网的蓬勃发展,保障用户在网络上的隐私和安全成为至关重要的任务。HTTPS证书,作为一种安全套接字层协议,扮演着网站安全的守护者。 1. 什么是HTTPS 证书? HTTPS(HyperText Transfer Protocol Secureÿ…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...