import { _decorator, Asset, Node, Prefab, instantiate, AssetManager, assetManager, sys } from 'cc'; export class ResManager { private static _instance: ResManager = null; public static get instance(): ResManager { if (!this._instance) { this._instance = new ResManager(); } return this._instance; } async loadPrefabFromBundle(bundleName: string, path: string, progressCallback?: (finished: number, total: number) => void): Promise { try { if (!sys.isBrowser) { assetManager.cacheManager.cacheEnabled = true; } const TOTAL = 200; let bundle = await new Promise((resolve, reject) => { assetManager.loadBundle( bundleName, (finished: number, total: number) => { if (typeof finished === 'number' && typeof total === 'number' && total > 0) { const overallFinished = Math.floor((finished / total) * 100); progressCallback?.(overallFinished, TOTAL); } }, (err, bundle) => err ? reject(err) : resolve(bundle) ); }); // 整包预加载,覆盖所有资源类型 await new Promise((resolve, reject) => { bundle.loadDir( '', (finished: number, total: number) => { if (typeof finished === 'number' && typeof total === 'number' && total > 0) { const overallFinished = 100 + Math.floor((finished / total) * 100); progressCallback?.(overallFinished, TOTAL); } }, (err) => err ? reject(err) : resolve() ); }); // 从缓存获取目标 Prefab,未命中再补一次 load let prefab = bundle.get(path, Prefab); if (!prefab) { prefab = await new Promise((resolve, reject) => { bundle.load(path, Prefab, (e, p) => e ? reject(e) : resolve(p)); }); } return instantiate(prefab); } catch (error) { console.error(`加载失败: ${bundleName}/${path}`, error); throw error; } } }