目录

  • 前言
  •       一、新建ResMgr.ts
  •       二、提问AI
  •       三、最终版本
  •       五、总结
  • 我们接上一篇【分包模块】,现在继续使用AI帮我们写一个【资源管理器】。

    前言

    资源管理器,主要提供资源加载、释放功能。
    我们对ccc现有的资源读取、加载、释放功能进行了简单封装,配合【分包管理器】使用。

    小白必读:资源管理器的用处?
    :对于项目而言,封装自己的资源管理器,可以减少大量重复代码,因为资源的加载读取和释放是我们游戏开发时使用最多的功能。另外对于后期ccc官方的API有所变动,我们只需要更新核心框架包调用API的部分代码,不会影响我们整个项目,非常NICE。

    一、新建ResMgr.ts

    我们继续在Core分包目录下的Scripts\Managers目录新建ResMgr.ts
    新建ResMgr.ts

    二、提问AI

    注意:现在我们需要结合BundleMgr.ts的分包加载读取,来写代码。
    1、点击提问区的 + 号
    2、选择BundleMgr.ts
    3、输入问题

    导入BundleMgr.ts,用ccc 3.8.x 内置 API 帮我们写一个ResMgr.ts资源管理器,实现:
    1、分包下单个资源和资源目录的动态读取、加载
    2、指定分包下单个资源的释放
    3、指定分包全部资源的释放
    4、释放所有资源
    5、参考BundleMgr单例方式,并导出

    提问AI

    三、最终版本

    import { Asset, assetManager } from 'cc';
    import { bundleMgr } from './BundleMgr';
    
    /**
     * 资源管理器
     * 用于分包下单个资源和资源目录的动态读取、加载和释放
     */
    class ResMgr {
        // 私有构造函数,防止外部实例化
        private constructor() {}
    
        /** 单例实例 */
        public static readonly instance: ResMgr = new ResMgr();
    
        /**
         * 动态读取分包下的单个资源
         * @param {string} bundleName - 分包名称
         * @param {string} url - 资源路径
         * @param {typeof Asset} type - 资源类型
         * @param {Function} callback - 读取完成时的回调函数
         */
        public loadAsset(bundleName: string, url: string, type: typeof Asset, callback: (err: Error | null, asset: any) => void) {
            bundleMgr.getBundle(bundleName, (err, bundle) => {
                if (err || !bundle) {
                    callback(err, null);
                    return;
                }
                bundle.load(url, type, (err, asset) => {
                    if (err) {
                        console.error(`加载资源失败: ${url}`, err);
                        callback(err, null);
                        return;
                    }
                    callback(null, asset);
                });
            });
        }
    
        /**
         * 动态读取分包下的资源目录
         * @param {string} bundleName - 分包名称
         * @param {string} url - 资源目录路径
         * @param {typeof Asset} type - 资源类型
         * @param {Function} callback - 读取完成时的回调函数
         */
        public loadDir(bundleName: string, url: string, type: typeof Asset, callback: (err: Error | null, assets: any[]) => void) {
            bundleMgr.getBundle(bundleName, (err, bundle) => {
                if (err || !bundle) {
                    callback(err, null);
                    return;
                }
                bundle.loadDir(url, type, (err, assets) => {
                    if (err) {
                        console.error(`加载资源目录失败: ${url}`, err);
                        callback(err, null);
                        return;
                    }
                    callback(null, assets);
                });
            });
        }
    
        /**
         * 释放指定分包下的单个资源
         * @param {string} bundleName - 分包名称
         * @param {string} url - 资源路径
         */
        public releaseAsset(bundleName: string, url: string) {
            const bundle = assetManager.getBundle(bundleName);
            if (bundle) {
                const asset = bundle.get(url);
                if (asset) {
                    bundle.release(url);
                }
            } else {
                console.warn(`分包未找到: ${bundleName}`);
            }
        }
    
        /**
         * 释放指定分包下的所有资源
         * @param {string} bundleName - 分包名称
         */
        public releaseAllAssetsInBundle(bundleName: string) {
            const bundle = assetManager.getBundle(bundleName);
            if (bundle) {
                bundle.releaseAll();
                assetManager.removeBundle(bundle);
            } else {
                console.warn(`分包未找到: ${bundleName}`);
            }
        }
    
        /**
         * 释放所有资源
         */
        public releaseAllAssets() {
            assetManager.releaseAll();
        }
    }
    
    /** 导出实例 */
    export const resMgr = ResMgr.instance;

    五、总结

    在实际项目中,我们使用资源的频率是非常高的,在上面的代码中我们在读取资源时,是通过上一章【分包模块】先加载分包,然后再加载分包下的单个资源或目录,简单一步到位。

    作者:ccs2d.com  创建时间:2024-09-28 11:59
    最后编辑:ccs2d.com  更新时间:2024-10-06 09:43
    上一篇:
    下一篇: