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

第四课、 TypeScript 中 Cocos 的生命周期

核心:理解Cocos引擎何时调用你的脚本方法,是正确编写游戏逻辑的基础。

TypeScript类继承自cc.Component,其生命周期由引擎自动管理。你通过重写(override)特定方法,在正确的时机执行你的代码。

一、Cocos的主要生命周期回调(按执行顺序)

方法名描述常用用途
onLoad组件首次激活时调用,在start之前。通常此时节点和组件都已初始化完毕。初始化:获取节点引用、缓存变量、初始化数据。这是最常用的初始化位置。
start在组件第一次激活前,也就是第一次执行update之前触发初始化:需要依赖其他组件初始化逻辑(例如获取其他节点的组件)。在onLoad之后执行。
update每一帧渲染前调用,频率取决于游戏帧率。游戏核心循环:处理移动、输入、计时等随时间变化的逻辑。
lateUpdate在所有update调用结束后执行跟随逻辑:例如相机跟随玩家,确保在玩家移动后再更新相机位置。
onEnable每当组件变为启用状态时调用启用时的处理:注册事件监听器、显示UI、恢复游戏逻辑。
onDisable每当组件变为禁用状态时调用禁用时的清理:取消事件监听器、隐藏UI、暂停游戏逻辑。这是防止内存泄漏的关键!
onDestroy当组件被销毁时调用最终清理:释放非引擎管理的资源、清除定时器等。

二、Cocos的生命周期流程图(非常重要)

加载节点/组件 -> onLoad -> (节点首次激活) -> onEnable -> start -> (每帧) update -> lateUpdate -> ... 
-> (组件被禁用) -> onDisable -> (组件再次启用) -> onEnable -> ... 
-> (组件被销毁) -> onDisable -> onDestroy

三、TypeScript中的代码示例

import { _decorator, Component, Node } from 'cc';
const { ccclass, property } = _decorator;@ccclass('PlayerComponent')
export class PlayerComponent extends Component {@property(Node)private target: Node | null = null; // 声明节点引用private _moveSpeed: number = 0;// 1. onLoad - 初始化onLoad() {console.log('Component is loaded!');// 通常在这里获取节点或组件if (this.target) {// 缓存一些初始信息}this._moveSpeed = 10; // 初始化数据}// 2. onEnable - 启用时onEnable() {console.log('Component is enabled!');// 注册游戏事件,例如触摸、键盘监听// input.on(Input.EventType.KEY_DOWN, this.onKeyDown, this);}// 3. start - 第一次激活前start() {console.log('Start is called!');// 可以访问其他组件的数据,因为其他组件的onLoad可能已经执行完毕}// 4. update - 每帧更新update(deltaTime: number) { // deltaTime 是上一帧到当前帧的时间间隔if (!this.target) return;// 移动逻辑,使用deltaTime保证帧率无关的运动// let pos = this.target.position;// pos.x += this._moveSpeed * deltaTime;// this.target.setPosition(pos);}// 5. onDisable - 禁用时onDisable() {console.log('Component is disabled!');// **重要!** 取消事件注册,防止重复注册和内存泄漏// input.off(Input.EventType.KEY_DOWN, this.onKeyDown, this);}// 6. onDestroy - 销毁时onDestroy() {console.log('Component is destroyed!');// 进行最终的资源清理}
}

四、实践重点与常见陷阱

  • onLoad vs start

    • onLoad:保证组件自身依赖已就绪。用于初始化自身变量和获取直接子节点。

    • start:保证其他组件onLoad已执行。用于需要访问其他兄弟组件或父组件的逻辑。

  • onEnable/onDisable是成对的:只要注册了事件监听器,就必须onDisableonDestroy中取消注册,否则当组件禁用或节点销毁后,监听器依然存在,会导致内存泄漏和报错。

  • 使用deltaTime:在update中做移动等操作时,一定要乘以deltaTime,这样才能保证在不同帧率的设备上速度一致(帧率无关)。

  • 性能优化:对于不需要每帧更新的逻辑,可以在组件中自己设置计时器,或者通过一个标志位来控制update中的逻辑执行频率。


文章转载自:

http://QguSAxoi.ffLnw.cn
http://7n1OQKyj.ffLnw.cn
http://jzNp6Kfn.ffLnw.cn
http://eOup9qNG.ffLnw.cn
http://UG9PAerw.ffLnw.cn
http://GAzXker3.ffLnw.cn
http://JvsUzd19.ffLnw.cn
http://B0F5eiz0.ffLnw.cn
http://gnBNCzdn.ffLnw.cn
http://9AuJNwIk.ffLnw.cn
http://LqPvB45M.ffLnw.cn
http://lD2gKmlt.ffLnw.cn
http://XNbRpsiE.ffLnw.cn
http://AbIwG5bi.ffLnw.cn
http://pnQfwky2.ffLnw.cn
http://jiIckADc.ffLnw.cn
http://QJGWNW6a.ffLnw.cn
http://vPAEnzCo.ffLnw.cn
http://WHUquXxN.ffLnw.cn
http://J7XN8Xqb.ffLnw.cn
http://1v6WfCeY.ffLnw.cn
http://0yuaRMh9.ffLnw.cn
http://p0c8zmZG.ffLnw.cn
http://h8hySlrp.ffLnw.cn
http://M3PIQ69O.ffLnw.cn
http://bLul1vQE.ffLnw.cn
http://Lu8BgSIl.ffLnw.cn
http://2OKRcMJb.ffLnw.cn
http://9sGpXCJJ.ffLnw.cn
http://i29cnWx9.ffLnw.cn
http://www.dtcms.com/a/385675.html

相关文章:

  • 联邦学习论文分享:DPD-fVAE
  • Pairwise排序损失:让机器学会排序的艺术
  • 硬件开发—IMX6ULL裸机—UART通信
  • 蓝牙上位机开发指南
  • 【课堂笔记】复变函数-1
  • 谈谈人大金仓数据库
  • C#调用钉钉API发送通知教程
  • 电子电气架构 --- 产线EOL为何需要智能升级?
  • 无人机姿态控制系统详解与实现
  • 7.Redis 主从复制(重在理解)
  • 从零搭建RAG应用:跳过LangChain,掌握文本分块、向量检索、指代消解等核心技术实现
  • 从0开始做一个完整项目 -- 软件跨平台编译打包全流程
  • comfyUI实战——使用openArt的工作流
  • linux 之 struct attribute
  • 强化学习PPO-分类任务
  • 决策树模型全解析:从分类到回归(基于鸢尾花数据集)
  • shell脚本部署lamp
  • c语言6:static 关键字控制变量/函数的 “生命周期” 与 “可见性”
  • MySQL 数据库对象与视图:从概念到实战,掌握虚拟表的核心价值
  • 【VPX361】基于3U VPX总线架构的XCZU47DR射频收发子模块
  • 消火栓设备工程量计算 -【图形识别】秒计量
  • 基于LangGraph的深度研究智能体技术解析
  • 【哈希表】1512. 好数对的数目|2506. 统计相似字符串对的数目
  • Java--多线程基础知识(2)
  • 活泼解析pthread_join函数:多线程世界的等待仪式
  • 机器视觉的智能手表后盖激光打标应用
  • 第七章 来日方长(2025.8学习总结)
  • 卡方检验公式中分母 (a+b)(c+d)(a+c)(b+d)的本质
  • IT基础知识——数据库
  • 电子衍射模拟:基于GPU加速的MATLAB/Julia实现