实用指南:《Cocos Creator 3 情怀棋牌源代码的全面重构与工程化实践》(下篇)
这两篇文章是我用了一周时间系统整理的实践笔记,希望能为你的开发工作提供一些参考价值。继续接着往下讲,把这套 Cocos Creator 3 的情怀棋牌源代码,从“能跑”讲到“好维护、好扩展、好交接”。
资源管理、打包和热更新

情怀这种体量的工程,资源管理如果不提前想明白,后面就是无穷无尽的手工搬砖。所以在 Cocos Creator 3 版本里,我最先做的是把资源分层和热更新边界划清楚。
我把资源简单分成三类:
核心公共资源:字体、基础按钮、通用特效、通用音效等
大厅资源:大厅 UI、图标、活动入口、游戏入口卡片等
子模块资源:各模块的牌面、牌桌、特效、逻辑预制体等
在 assets 目录下就是这种结构:
assets/
common/ 公共 bundle
lobby/ 大厅 bundle
games/
game_a/ 子模块 A
game_b/ 子模块 B
...
Cocos Creator 3 的好处是,一个目录就是一个独立 bundle。打热更新包时,我按照 bundle 维度来划分版本:
common 基本长期不变
lobby 更新频率中等
games 下的各模块单独维护版本号
这样你要给某个模块做一个大改动,只需要重新导出那一个 bundle,对其他模块没有影响。
一个最简单的资源加载示例:
import { assetManager, Prefab, instantiate, Node } from 'cc';
export async function loadPrefabFromBundle(bundleName: string, path: string): Promise {
return new Promise((resolve, reject) => {
assetManager.loadBundle(bundleName, (err, bundle) => {
if (err || !bundle) {
return reject(err);
}
bundle.load(path, Prefab, (err2, prefab) => {
if (err2 || !prefab) {
return reject(err2);
}
const node = instantiate(prefab);
resolve(node);
});
});
});
}
进入某个模块时,只需要:
const node = await loadPrefabFromBundle('games/game_a', 'prefabs/GameAEntry');
this.node.addChild(node);
整套逻辑很直白,但配合 bundle 结构之后,资源边界就很清晰,对后面做热更新、做模块级灰度都有帮助。
热更新逻辑的实现思路
热更新这块,不同项目会有不同复杂度,这里我说一种基础版的方案,实现成本不高,稳定性还可以。
做法是:
每个 bundle 有一个 manifest 文件,记录版本号、资源列表和 hash
客户端启动时先请求服务器的 manifest,对比本地
有差异的 bundle 拉取对应的资源包下载并替换
一个简化版的 manifest 结构:
{
"bundle": "games/game_a",
"version": "1.0.3",
"files": {
"import/0a/0aabb....json": "hash1",
"native

浙公网安备 33010602011771号