3.Eric-MVVM-Framework-分包管理
- 新建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.运行预览

浙公网安备 33010602011771号