《Cocos 游戏开发实战》5.3 常驻节点与全局管理
本节讲清 director.addPersistRootNode 到底做了什么、目标节点必须位于层级根节点这条约束从何而来,用 PersistentRoot 承载音频、存档与转场等全局管理器,并说明常驻节点上组件 onLoad 只调一次带来的初始化陷阱与切后台自动存档的接法。
tag
本节讲清 director.addPersistRootNode 到底做了什么、目标节点必须位于层级根节点这条约束从何而来,用 PersistentRoot 承载音频、存档与转场等全局管理器,并说明常驻节点上组件 onLoad 只调一次带来的初始化陷阱与切后台自动存档的接法。
静态引用会让首包失控,动态加载是资源管线的另一半。本节讲清 resources.load、bundle.load、loadRemote 三种 API 的取舍,把回调式加载包成 Promise,用 loadDir 批量读配置表,讲透 addRef / decRef 的引用计数规则与 releaseAsset 只减引用不立即销毁的坑,并给出一个可单测的引用计数管理器与 preload 预加载。
组件之间硬引用会织出蜘蛛网。本节把 Cocos Creator 3.8 的三种通信方式摆开对比:直接引用、getComponent、事件。讲清节点事件与全局 EventTarget 总线、target 参数绑定 this 的坑、触摸坐标从屏幕到节点空间的两次换算、全局 input 与 KeyCode 接键盘跳跃,并给出编辑器里给 Button 绑定 Click Events 的步骤与场景文件结构。
进编辑器搭出 block-dash 的 main 场景:从层级管理器右键创建 Canvas 开始,讲清节点树、父子关系与变换,把可复用的金币做成预制体,用 instantiate 在运行时复制它,并打开 main.scene 看 _components 数组里的 __type__ 到底存了什么。
本节把《方块冲刺》的运营侧补齐:用一张 activities.json 描述活动与时段,纯逻辑校验时间窗、权重与互斥优先级,运行时下发并本地兜底,再定义一套埋点事件模型与看板四项核心指标,让运营能自己上活动、关活动、看数据,而不必每次改代码发版。文末给出与 17.1/17.2 共用的配置骨架与工程收口。
本节讲《方块冲刺》的热更与线上修复:先划清热更能改什么、绝不能改什么,再看资源热更的 manifest 与版本比对机制、原生端 native.AssetsManager 的完整调用时序、bundle 热更与脚本热更的边界,并给出一次线上修复的可执行流程与可类型检查的 HotUpdate 组件。
《方块冲刺》到了上线阶段,本节讲灰度与回滚:为什么小游戏比原生更需要灰度、H5 与微信小游戏与原生三端各自能用的灰度手段、远端开关与版本门的实现、按设备哈希确定性分桶、灰度期的观测指标,以及 P0/P1/P2 三套回滚预案,并给出可类型检查的 RemoteConfig 组件与纯逻辑版本门。
首包压下去了、资源上了 CDN,用户从点开到看到第一屏仍要等。本节把启动时间拆成「引擎初始化 / 脚本执行 / 首场景加载 / 首屏渲染」四段,用引擎事件打点、用纯函数聚合,给出五个可落地的削减动作与构建面板里的对应开关,并把首屏预算对齐到 1.1 的 NFR-02。
上一节把资源从首包挪进了 Bundle,但只要分包还打进包体,用户就只是把 4 MB 的红线换成了 20 MB 的总量红线。本节把 bundle-levels 改成远程包、托管到 CDN,给出构建面板里的远程地址与版本目录配置、可编译的加载脚本,以及一张按文件类型划分的缓存头策略表。
微信小游戏给主包划了 4 MB 红线,首包多塞一张背景图就可能上不了架。本节把《方块冲刺》的资源按「首包只留启动场景与主 UI、关卡资源进 bundle-levels」切开,给出编辑器里配置 Bundle 的完整步骤与 .meta 内容,并写出一个能过 tsc 的分包加载管理器。
11.1 的存档里留了个 settings.language 没实现。本节把 UI 文案外置成 JSON 资源,用 sys.languageCode 探测系统语言、允许玩家手动覆盖,写一个带插值的 i18n 核心和一个跟随语言的 Label 组件,最后对比系统字体、TTF 与位图字体三种方案,并说清微信小游戏对字体的真实限制。
同一个账号在手机和平板上各玩一局,两份进度就会打架。本节先定客户端与服务端的云存档接口约定,再给出「先拉后推」的同步时序,然后写一段可单测的字段级合并算法(最远距离取最大、资产取较新),最后按平台分派传输层:微信走云开发、H5 与原生走 HTTP。
第 9 章让《方块冲刺》动起来了,但没有声音的反馈是空的。本节从 AudioSource 讲起,说清 BGM、音效、语音三类需求的差异,给出常驻节点上的 AudioManager 组件、playOneShot 的并发上限,以及一个可单测的音效池优先级调度器。
Cocos 工程该提交什么、永远不提交什么:给出完整 .gitignore 与 Git LFS 配置,讲清 .scene/.prefab 为什么难合并、多人协作怎么切场景与预制体,定下提交信息与分支约定,写一个可单测的语义化版本比较函数,并把版本号打进运行时的 BuildStamp 组件。
金币旋转、道具闪烁、弹窗弹入——这些「一个数在变」的动效不值得开动画编辑器。本节讲透 Cocos 3.8 的 tween:目标、动作、控制三层模型,to/by/sequence/parallel 的组合,easing 曲线怎么挑手感,以及目标被销毁导致的 tween 泄漏怎么防。
上一节让方块会跳,但它仍能穿过金币与尖刺。本节给《方块冲刺》装上碰撞规则:先在项目设置里规划 PLAYER/GROUND/COIN/HAZARD 分组与碰撞矩阵,再用 Contact2DType 接触回调把「谁撞了谁」路由成业务事件,接着实现金币拾取、尖刺致死与 goalX 进度推进,并给出 main.scene 的节点树。
本节把《方块冲刺》的输入与角色控制落到 Cocos Creator 3.8:先用 input 与 Input.EventType 把键盘空格、方向键与触摸归一成跳示意向,再用 RigidBody2D 写自动跑与可变高度跳跃,最后补齐土狼时间、跳跃缓冲、松手切跳三件套手感,并给出 Player.prefab 的编辑器搭建步骤与组件面板取值。
本节对比 director.loadScene、preloadScene 与 bundle.loadScene 三条切换路径,用转场遮罩消除裸切场景的黑帧,把下一关资源的预加载挪进结算界面,并用场景生命周期事件收尾清理;同时给出场景间传参的 SceneRouter 与可直接单测的纯逻辑实现。
资源管线决定首包多大、加载多快。本节讲清 assets/ 的目录分层、resources 目录的特殊性、Bundle 到底是什么(内置 main/resources/internal/start-scene 与自定义 Bundle 的区别)、怎么把目录配置成 bundle-levels 分包、Bundle 优先级与依赖,以及代码里怎么拿到 Bundle,最后给出《方块冲刺》首包与分包的具体划分。
组件挂上节点后代码何时执行,是卷二一半 bug 的根因。本节讲透 Cocos Creator 3.8 的七个生命周期回调、引擎一帧的调度骨架、@executionOrder 如何决定同类回调先后、director 的帧级事件钩子、schedule 与 scheduleOnce 定时调度,以及「节点未激活时 start 不触发」这类首帧陷阱,并给出打印验证顺序的步骤与输出。