3.Eric-MVVM-Framework-分包管理

  1. 新建BundleMgr类
/**
 * 源码作者:<EricShang>
 */

import { assetManager, AssetManager } from "cc";

/**
 * 分包管理器
 * 提供分包加载、获取、移除功能。
 */
export class BundleMgr {
    /**
     * 单例模式
     */
    private static _instance: BundleMgr = null;
    public static get instance() {
        if (this._instance == null) {
            this._instance = new BundleMgr();
        }
        return this._instance;
    }
    /**
     * 私有构造确保外部无法创建该类的实例
     */
    private constructor() {
    }
    /**

     * 获取指定分包,如果未加载则进行加载。

     * @param nameOrUrl - 分包名称或URL。

     * @param onProgress - 进度回调函数。

     * @returns Promise<AssetManager.Bundle | null> - 加载完成后的Promise。

     */
    public async getBundle(nameOrUrl: string, onProgress?: (progress: number) => void): Promise<AssetManager.Bundle | null> {

        const bundle = assetManager.getBundle(nameOrUrl);

        if (bundle) return bundle;

        try {

            const loadedBundle = await this.loadBundle(nameOrUrl);

            if (onProgress) {

                await this.loadAssetsWithProgress(loadedBundle, onProgress);

            }

            return loadedBundle;

        } catch (error) {

            eric.log.err(`分包 ${nameOrUrl} 加载失败`, error.message);

            return null;

        }

    }
    /**

    * 加载指定分包。

    * @param nameOrUrl - 分包名称或URL。

    * @returns Promise<AssetManager.Bundle> - 加载完成后的Promise。

    */
    private loadBundle(nameOrUrl: string): Promise<AssetManager.Bundle> {

        return new Promise((resolve, reject) => {

            assetManager.loadBundle(nameOrUrl, (err, loadedBundle) => {

                if (err) {

                    reject(err);

                } else {

                    resolve(loadedBundle);

                }

            });

        });

    }
    /**

    * 加载分包中的资源并提供进度反馈。

    * @param bundle - 已加载的分包。

    * @param onProgress - 进度回调函数。

    * @returns Promise<void> - 加载完成后的Promise。

    */
    private loadAssetsWithProgress(bundle: AssetManager.Bundle, onProgress: (progress: number) => void): Promise<void> {

        return new Promise((resolve, reject) => {

            const assets = bundle.getDirWithPath('');

            const totalAssets = assets.length;

            let loadedAssets = 0;

            if (totalAssets === 0) {

                onProgress(1);

                resolve();

                return;

            }

            assets.forEach((asset) => {

                bundle.load(asset.path, (err) => {

                    if (err) {

                        reject(err);

                        return;

                    }

                    loadedAssets++;

                    onProgress(loadedAssets / totalAssets);

                    if (loadedAssets === totalAssets) {

                        resolve();

                    }

                });

            });

        });

    }


}


2.建立bundle管理器映射

3.测试

  • 新建一个bundle,里面放两个预制体测试一下
  • 在main.ts中
/**
 * 源码作者:<EricShang>
 */
import { _decorator, Component, Node } from 'cc';
const { ccclass, property } = _decorator;

@ccclass('Test')
export class Test extends Component {
    protected onLoad(): void {
        eric.bundle.getBundle("testres", this.bundleProgess)
            .then((bundle) => {
                eric.log.info("分包加载成功")
            });
    }
    start() {
        eric.log.debug('Test debug');
        eric.log.err('Test error');
        eric.log.warn('Test warn');
        eric.log.info('Test info');

    }
    bundleProgess(progress: number) {
        eric.log.debug('分包加载进度', progress);
    }

    update(deltaTime: number) {

    }
}


4.运行预览
image

posted @ 2024-11-22 17:17  EricShx  阅读(21)  评论(0)    收藏  举报