news 2026/7/4 22:12:26

Unity生命周期函数笔记

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Unity生命周期函数笔记

当我们使用观察者模式、事件监听时,关于生命周期函数执行顺序的很多问题会浮现出来。

Awake()、OnEnable()、Start()

  1. 物体激活、脚本启用时,执行顺序是Awake、OnEnable、Start;
  2. 进入场景时失活的物体会执行Awake,不执行后两个;
  3. 进入场景时未启用脚本会执行Awake,不执行后两个;
  4. 当物体激活且脚本启用时执行OnEnable;
  5. Start可以理解为第一次OnEnable后执行;

deepseek回答:

在Unity中,未激活的物体不会执行Start方法24。具体执行规则如下:

  1. 初始未激活的物体‌:

    • 若游戏物体初始状态为active=false,其所有脚本的Awake和Start都不会执行6
    • 只有当通过SetActive(true)激活物体时,才会首次触发Awake和Start46
  2. 脚本启用状态的影响‌:

    • Awake会在脚本实例加载时立即执行,即使脚本的enabled=false2
    • Start必须同时满足两个条件才会执行:
      • 游戏物体处于激活状态(activeInHierarchy=true)
      • 脚本组件启用(enabled=true)26
  3. 生命周期特性‌:

    • Start在整个物体生命周期中只会执行一次56
    • 若物体被反复激活/禁用,只有OnEnable/OnDisable会重复触发56

执行顺序总结:

  1. 首次激活物体时:Awake → OnEnable → Start35
  2. 后续禁用再激活时:仅触发OnEnable

一帧里Update、LateUpdate和协程的执行顺序

Unity一帧内Update与协程的执行顺序遵循以下规则:

  1. 基础执行顺序

    • 每帧先执行所有脚本的Update()函数,再处理协程中yield return之后的代码2
    • 若协程使用WaitForEndOfFrame,则会在所有LateUpdate()调用结束后执行1
  2. 协程启动时机影响

    • 在Awake/OnEnable中启动的协程会在首帧Update前被处理2
    • 在Start中启动的协程需等到下一帧Update才会执行2
  3. 多协程优先级

    • 后启动的协程会优先执行(LIFO原则)2

    • 例如同时存在协程A和B,若先启动A后启动B,则当前帧会先执行B的后续代码2

  4. 特殊延迟类型

    • WaitForFixedUpdate:在FixedUpdate之后、Update之前执行14
    • WaitForSeconds:受Time.timeScale影响,实际执行时机可能跨帧1
  5. 与LateUpdate的关系

    • LateUpdate()始终在所有Update和常规协程执行完毕后调用34
    • 但若协程包含yield return null,其后续代码会在LateUpdate前执行1
  1. 物理帧同步
    • FixedUpdate()独立于主线程帧率,每物理时间步长强制调用(默认0.02秒)1
    • 当游戏卡顿时,Unity会通过补帧机制保证FixedUpdate按固定频率执行1

注:完整生命周期顺序为
Awake → OnEnable → Start → FixedUpdate → Update → 协程(非WaitForEndOfFrame)→ LateUpdate→协程(WaitForEndOfFrame)→ OnDisable → OnDestroy

脚本执行顺序与OnDestroy

设置脚本执行顺序不能控制OnDestroy的执行顺序,据说销毁顺序主要受组件添加顺序影响。

是执行完所有脚本的Awake后执行OnEnable吗?

NO!不是所有Awake执行完才执行OnEnable

// 假设有 ScriptA 和 ScriptB 两个脚本 // 都在同一个GameObject上 public class ScriptA : MonoBehaviour { void Awake() => Debug.Log("A.Awake"); void OnEnable() => Debug.Log("A.OnEnable"); } public class ScriptB : MonoBehaviour { void Awake() => Debug.Log("B.Awake"); void OnEnable() => Debug.Log("B.OnEnable"); }

A.Awake ← ScriptA的Awake
A.OnEnable ← ScriptA的OnEnable ❗注意这里!
B.Awake ← ScriptB的Awake
B.OnEnable ← ScriptB的OnEnable

1. 创建GameObject

2. 添加第一个组件(如ScriptA)

3. 调用 ScriptA.Awake()

4. 调用 ScriptA.OnEnable() ← 立即调用!

5. 添加第二个组件(如ScriptB)

6. 调用 ScriptB.Awake()

7. 调用 ScriptB.OnEnable()

对于不同GameObject:

场景加载

GameObject1创建

组件A.Awake() → 组件A.OnEnable() ← 成对执行!

组件B.Awake() → 组件B.OnEnable() ← 成对执行!

GameObject2创建

组件C.Awake() → 组件C.OnEnable() ← 成对执行!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/3 16:03:51

ComfyUI模型路径配置终极指南:3步解决工作流验证失败问题

ComfyUI模型路径配置终极指南:3步解决工作流验证失败问题 【免费下载链接】ComfyUI-Manager 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-Manager 在AI绘画创作过程中,你是否遇到过这样的困扰:明明模型文件已经下载完成&am…

作者头像 李华
网站建设 2026/7/3 2:14:18

HarmonyOS应用开发—页面路由

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-router-V5 路由简介: 普通用户:网址 开发人员:域名 》延伸知识点 域名价格 65左右、域名后缀 com商业/cn中国/net网络供应商/edu教育/org非营利性/it意大利…

作者头像 李华
网站建设 2026/7/3 0:45:28

大文件上传:秒传、断点续传、分片上传

大文件上传:秒传、断点续传、分片上传 文章目录大文件上传:秒传、断点续传、分片上传前言一、大文件上传的挑战二、秒传三、分片上传四、断点续传总结前言 大文件上传是 Web 开发中高频且复杂的需求,核心痛点集中在传输稳定性、效率、服务器…

作者头像 李华
网站建设 2026/7/3 1:30:01

WindowsCleaner:一键解决C盘爆红的智能清理神器

WindowsCleaner:一键解决C盘爆红的智能清理神器 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 还在为Windows系统C盘爆红而烦恼吗?&#…

作者头像 李华
网站建设 2026/6/30 23:03:03

小红书无水印下载器完整教程:从零开始快速掌握

小红书无水印下载器完整教程:从零开始快速掌握 【免费下载链接】XHS-Downloader 免费;轻量;开源,基于 AIOHTTP 模块实现的小红书图文/视频作品采集工具 项目地址: https://gitcode.com/gh_mirrors/xh/XHS-Downloader 还在为…

作者头像 李华
网站建设 2026/7/4 14:47:11

深蓝词库转换:彻底告别输入法切换困扰的终极解决方案

深蓝词库转换:彻底告别输入法切换困扰的终极解决方案 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 还在为更换输入法时丢失多年积累的个性化词库而苦恼…

作者头像 李华