资源加载【CocosCreator】

CocosCreator资源加载

CocosCreator资源加载

先吐槽一下

用 Cocos Creator 开发也有段时间了,说实话资源加载这块一直让我挺头疼的。

每次写加载代码都是这样,或者先加载bundle再这样:

resources.load("prefab/player", Prefab, (err, prefab) => {
    if (err) {
        console.error(err);
        return;
    }
    // 终于可以用了
});

加载个资源要写这么一坨,关键是项目里到处都是这种代码。

更麻烦的是批量加载。比如进入战斗场景,我要加载:

  • config 文件夹下的配置
  • icon 文件夹下的图标
  • prefab 文件夹下的预制体
  • 还有其他 bundle 里的资源

这时候就得自己写循环、计算进度、处理异常…每个项目都要封装一遍,烦死了。

还有资源释放的问题。退出战斗场景时,怎么把刚才加载的资源都释放掉?一个个记录路径?太蠢了。引用计数?自己管理容易出错。

反正就是觉得官方的 API 不太够用,每次都要自己折腾。

干脆自己封装一个

既然每个项目都要写,不如封装成库,以后直接用。于是就有了 bit-assets。

核心思路很简单:

  1. 用配置的方式批量加载资源
  2. 自动管理资源池和引用计数
  3. 支持按批次释放资源

批量加载资源

import { AssetLoader, IAssetConfig } from "kunpocc-assets";

// 把要加载的资源配置好
let configs: IAssetConfig[] = [
    { path: "config" },
    { path: "icon", type: SpriteFrame },
    { path: "prefab", type: Prefab },
    { path: "texture/avatar", type: SpriteFrame, isFile: true },  // 单个文件
    { path: "pet", type: SpriteFrame, bundle: "battle" },     // 其他 bundle
];

// 创建加载器
let loader = new AssetLoader("battle");  // 给个名字,后面释放用得上
loader.parallel = 10;  // 并行的任务数量
loader.retry = 3;      // 失败了重试 3 次

loader.setCallbacks({
    complete: () => {
        console.log("加载完了");
    },
    fail: (code, msg) => {
        console.error("加载失败:", msg);
    },
    progress: (percent) => {
        console.log("进度:", Math.floor(percent * 100) + "%");
    }
});

loader.start(configs);

使用已加载的资源

import { AssetPool } from "kunpocc-assets";

let prefab = AssetPool.get<Prefab>("prefab/player");
let icon = AssetPool.get<SpriteFrame>("icon/gold", "bundleName");

// 也可以用 UUID 获取
let asset = AssetPool.getByUUID<SpriteFrame>("xxxxx-xxxx-xxxx");

释放资源

import { AssetPool } from "kunpocc-assets";

// 释放单个资源
AssetPool.releasePath("prefab/player");

// 释放整个文件夹下的 SpriteFrame 类型资源
AssetPool.releaseDir("icon", "resources", SpriteFrame);

// 重点:按批次释放
AssetPool.releaseBatchAssets("battle");  // 把刚才加载的战斗资源全释放掉

// 释放所有资源
AssetPool.releaseAll();

这个批次释放真的很好用。比如我做了个战斗场景和商城场景:

// 进战斗
let battleLoader = new AssetLoader("battle");
battleLoader.start(battleConfigs);

// 进商城
let shopLoader = new AssetLoader("shop");
shopLoader.start(shopConfigs);

// 退出战斗,一行代码释放所有战斗资源
AssetPool.releaseBatchAssets("battle");

// 退出商城,一行代码释放所有商城资源
AssetPool.releaseBatchAssets("shop");

场景切换的时候再也不用担心资源释放的问题了。

其他功能

用Creator加载的资源也可以加入到管理中,最后统一释放

resources.load("prefab/player", Prefab, (err, prefab) => {
    if (err) {
        console.error(err);
        return;
    }
    // 参数1: 资源
    // 参数2: 资源所在的bundle 默认: resources
    // 参数3: 资源加载批次名 可以不传 默认 ""
    AssetPool.add(prefab, resources, "batchName");
});

一些特点

  • 支持 Cocos Creator 3.7+
  • 没有其他依赖,就几个文件
  • 自动管理引用计数,不用担心内存泄漏
  • 同一个资源加载多次和一次效果一样,释放一次卸载

开源免费

代码放 GitHub 上了,ISC 协议,随便用:

  • GitHub: https://github.com/Gongxh0901/kunpocc-assets
  • NPM: https://www.npmjs.com/package/kunpocc-assets

也有商城版本,同样免费

有 bug 或者建议欢迎提 issue,我看到会回复。

最后

这个库主要是我自己项目在用,觉得还挺顺手的,就分享出来了。

如果你也觉得 Creator 的资源加载 API 不太好用,可以试试这个。代码不多,看源码也很快。

有问题随时交流。