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

Unity基础学习(四)生命周期函数

目录

前置小知识:

帧与帧更新的含义

​1. 帧(Frame)​​

​2. 帧更新(Frame Update)​​

3、在Unity中显示代码的打印信息的方式:

一、什么是生命周期函数

二、有哪些生命周期函数

1、​Awake()​​

2、​OnEnable()​​

3、​Start()​​

4、​FixedUpdate()​​

5、​Update()​​

6、​LateUpdate()​​

7、​OnDisable()​​

8、​OnDestroy()​​

9、​OnGUI()​​

10、OnApplicationQuit()​​​:

几组对比:

Awake()和Start():

FixedUpdate() Update() LateUpdate():

OnEnable() OnDisable():

三、总结

Awake → OnEnable → Start → FixedUpdate → Update → LateUpdate → OnDisable → OnDestroy


前置小知识:

帧与帧更新的含义

1. 帧(Frame)​

        帧是游戏画面更新的基本单位,指一个静态的瞬时图像。游戏运行时,引擎通过连续渲染一系列帧(每秒数十次)形成动态画面。

帧率(FPS)​​:每秒渲染的帧数,例如 60 FPS 表示每秒生成 60 帧画面。帧率越高,画面越流畅。

实时性​:游戏的帧是实时渲染生成的(而非预录制),因此帧率可能因硬件性能或场景复杂度波动。

2. 帧更新(Frame Update)​

        帧更新是Unity引擎在每一帧中处理游戏逻辑的核心过程,主要通过生命周期函数(如 Update() 和 LateUpdate())实现。

Update()​​:每帧调用一次,处理实时逻辑(如角色移动、输入检测)。

LateUpdate()​​:在所有 Update() 完成后调用,处理依赖其他对象更新后的逻辑(如摄像机跟随)。

作用​:驱动游戏动态变化,确保逻辑与画面渲染同步。

3、在Unity中显示代码的打印信息的方式:

使用Debug.Log("打印内容");

使用Debug.LogError("打印自定义报错");

使用Debug.LogWarning("打印自定义警告");

使用print("打印信息");(不过这个API必须得在继承了MonoBehaviour的类中使用)


一、什么是生命周期函数

​        生命周期函数是Unity引擎在游戏对象(GameObject)或脚本的特定阶段自动调用的预定义方法。这些方法属于MonoBehaviour类,开发者通过实现它们来控制对象的初始化、更新、销毁等行为。它们的执行顺序和触发时机由Unity内部管理,无需手动调用

二、有哪些生命周期函数

注意:
生命周期函数的访问修饰符一般为private和protected

1、​Awake()​

触发时机​:脚本实例化时调用。啥意思呢,就是说当你的脚本或者对象第一次出现在场景中或者Hierarchy时候,就会调用该函数(如果你有的话)。我测试的情况是只有当你的对象处于激活状态时,才会触发

用途​:初始化变量、获取组件引用。

注意​:每个脚本仅调用一次,在OnEnable()Start()之前执行。

public class TestAwake : MonoBehaviour {private void Awake() {Debug.Log("Awake被调用!对象激活状态:" + gameObject.activeSelf);}
}

2、​OnEnable()​

触发时机​:对象激活(Active)或脚本组件启用(Enabled)时。

用途​:重新启用对象时的初始化(如事件订阅)。

注意​:可能多次触发(如反复激活对象)。

这个就是失活激活按键,当你的对象每次激活时便会触发这个函数。

3、​Start()​

触发时机​:对象激活后,在第一次Update()前调用。做一些初始化工作。和Awake的主要区别就是,这个是在第一帧函数更新前执行的函数,零帧启动!

用途​:依赖其他组件的初始化(如查找其他对象)。

注意​:仅调用一次,在OnEnable()之后。

4、​FixedUpdate()​

触发时机​:固定物理时间间隔(默认0.02秒)。

用途​:执行物理相关操作(如Rigidbody控制)。

注意​:频率由Time.fixedDeltaTime定义,与帧率无关。

在这里可以修改帧率:​Edit → Project Settings → Time​(时间管理器),第一个就是

Fixed Timestep控制 FixedUpdate() 的调用间隔(单位:秒),值越小物理模拟越精确。

5、​Update()​

触发时机​:每帧调用一次。

用途​:处理游戏逻辑、输入检测,等需要实时监测的地方。

注意​:执行频率受帧率影响(如卡顿时调用次数减少)。

6、​LateUpdate()​

触发时机​:所有Update()执行完毕后调用。

用途​:摄像机跟随、后处理逻辑。

注意​:确保所有对象已完成本帧更新。

7、​OnDisable()​

触发时机​:对象禁用或脚本组件禁用时。这个就和前面的OnEnable()​是互补的

用途​:清理资源、取消事件订阅。

注意​:可能多次触发(如反复禁用对象)。

8、​OnDestroy()​

触发时机​:对象销毁时(如场景卸载或调用Destroy())。被销毁时想执行的内容就可以放在这里面

用途​:释放资源、销毁关联对象。

注意​:若对象未激活,可能跳过OnDisable()直接调用。

9、​OnGUI()​

触发时机​:每帧多次调用(渲染GUI时)。这个就是GUI的知识了,我们后面学习。

用途​:旧版IMGUI系统的界面绘制。

注意​:高频率调用,避免复杂逻辑。

10、OnApplicationQuit()​​​:

触发时机​:应用退出前(包括编辑器停止播放),就是游戏退出时你要执行什么。

用途​:保存数据、释放全局资源。

几组对比:

Awake()和Start():

对比项Awake()​Start()​
触发时机脚本实例化时(即初始创建时)。对象激活后,在首次 Update() 前调用。
调用次数仅一次(即使对象被反复激活/禁用)。仅一次(对象首次激活时)。
用途初始化变量、获取组件引用。依赖其他组件的初始化(如查找对象)。
执行顺序先于 OnEnable() 和 Start()在 OnEnable() 之后。
依赖激活状态是(需对象激活)。

FixedUpdate() Update() LateUpdate():

对比项FixedUpdate()​Update()​LateUpdate()​
触发时机固定时间间隔(默认 0.02秒)。每帧调用(依赖帧率)。所有 Update() 执行完毕后调用。
调用频率固定(与帧率无关)。不固定(帧率高则调用频繁)。同 Update()
用途物理模拟(如 Rigidbody 操作)。游戏逻辑、输入处理、动画控制。后处理逻辑(如摄像机跟随)。
时间参数Time.fixedDeltaTime(固定值)。Time.deltaTime(上一帧耗时)。Time.deltaTime(同 Update())。
示例场景施加力、碰撞检测后的逻辑。玩家移动、UI 刷新。调整摄像机位置。

OnEnable() OnDisable():

对比项OnEnable()​OnDisable()​
触发时机对象/脚本激活或启用时。对象/脚本禁用或停用时。
调用次数多次(每次激活时)。多次(每次禁用时)。
用途事件订阅、激活时的初始化。取消事件订阅、释放资源。
依赖激活状态是(需对象或脚本激活)。是(需对象或脚本禁用)。
典型配对逻辑OnEnable() 中注册事件。OnDisable() 中注销事件。

三、总结

执行顺序简化示意:

Awake → OnEnable → Start → FixedUpdate → Update → LateUpdate → OnDisable → OnDestroy

函数名触发时机使用场景注意事项
Awake脚本加载时(无论对象是否激活)初始化变量、获取组件引用仅调用一次,在OnEnable前执行
OnEnable对象激活或脚本启用时事件订阅、启用时初始化可能多次触发
Start对象激活后,首次Update依赖其他组件的初始化仅调用一次,在OnEnable后执行
FixedUpdate固定物理时间间隔(默认0.02秒)物理相关操作(如力施加)与帧率无关
Update每帧一次游戏逻辑、输入处理受帧率影响
LateUpdate所有Update执行完毕后摄像机跟随、后处理逻辑确保其他对象已更新
OnDisable对象禁用或脚本禁用时清理资源、取消事件订阅可能多次触发
OnDestroy对象销毁时释放资源、销毁关联对象对象未激活时可能跳过OnDisable
OnGUI每帧多次(GUI渲染时)旧版IMGUI绘制避免复杂逻辑
OnApplicationQuit应用退出前全局数据保存、资源释放编辑器停止播放时也会触发
http://www.xdnf.cn/news/3720.html

相关文章:

  • 机器人编程基础---C语言中的表达式和求值
  • PyTorch_点积运算
  • c++回调函数
  • 嵌入式硬件篇---STM32 系列单片机型号命名规则
  • PyTorch_指定运算设备 (包含安装 GPU 的 PyTorch)
  • C++八股--5--设计模式--适配器模式,代理模式,观察者模式
  • 大数据:驱动技术创新与产业转型的引擎
  • 【RocketMQ NameServer】- NettyEventExecutor 处理 Netty 事件
  • 网格不迷路:用 CSS 网格生成器打造完美布局
  • Linxu基本操作
  • 单片机裸机环境下临界区保护
  • Golang WaitGroup 用法 源码阅读笔记
  • # LeetCode 1007 行相等的最少多米诺旋转
  • 动态规划-1137.第N个泰波那契数-力扣(LeetCode)
  • 【iview】es6变量结构赋值(对象赋值)
  • 【LLaMA-Factory实战】1.3命令行深度操作:YAML配置与多GPU训练全解析
  • 轻量级RTSP服务模块:跨平台低延迟嵌入即用的流媒体引擎
  • 从融智学视域快速回顾世界历史和主要语言文字最初历史证据(列表对照分析比较)
  • Vue实现成绩增删案例
  • C++ 中的继承
  • JSON 处理笔记
  • npm pnpm yarn 设置国内镜像
  • 数据库原理与应用实验二 题目七
  • PowerShell安装Chocolatey
  • 哈希函数详解(SHA-2系列、SHA-3系列、SM3国密)案例:构建简单的区块链——密码学基础
  • Python刷题:流程控制(下)
  • PowerPC架构详解:定义、应用及特点
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】1.1 数据库核心概念与PostgreSQL技术优势
  • C++负载均衡远程调用学习之 Dns-Route关系构建
  • 代码随想录算法训练营Day43