实用指南:《Cocos Creator 3 情怀棋牌源代码的全面重构与工程化实践》(下篇)

这两篇文章是我用了一周时间系统整理的实践笔记,希望能为你的开发工作提供一些参考价值。继续接着往下讲,把这套 Cocos Creator 3 的情怀棋牌源代码,从“能跑”讲到“好维护、好扩展、好交接”。

资源管理、打包和热更新

情怀这种体量的工程,资源管理如果不提前想明白,后面就是无穷无尽的手工搬砖。所以在 Cocos Creator 3 版本里,我最先做的是把资源分层和热更新边界划清楚。

我把资源简单分成三类:

  1. 核心公共资源:字体、基础按钮、通用特效、通用音效等

  2. 大厅资源:大厅 UI、图标、活动入口、游戏入口卡片等

  3. 子模块资源:各模块的牌面、牌桌、特效、逻辑预制体等

在 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 结构之后,资源边界就很清晰,对后面做热更新、做模块级灰度都有帮助。


热更新逻辑的实现思路

热更新这块,不同项目会有不同复杂度,这里我说一种基础版的方案,实现成本不高,稳定性还可以。

做法是:

  1. 每个 bundle 有一个 manifest 文件,记录版本号、资源列表和 hash

  2. 客户端启动时先请求服务器的 manifest,对比本地

  3. 有差异的 bundle 拉取对应的资源包下载并替换

一个简化版的 manifest 结构:

{
  "bundle": "games/game_a",
  "version": "1.0.3",
  "files": {
    "import/0a/0aabb....json": "hash1",
    "native
posted @ 2025-12-16 12:54  yangykaifa  阅读(1)  评论(0)    收藏  举报