65 lines
2.4 KiB
TypeScript
65 lines
2.4 KiB
TypeScript
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<Node> {
|
||
try {
|
||
if (!sys.isBrowser) {
|
||
assetManager.cacheManager.cacheEnabled = true;
|
||
}
|
||
|
||
const TOTAL = 200;
|
||
|
||
let bundle = await new Promise<AssetManager.Bundle>((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<void>((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<Prefab>((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;
|
||
}
|
||
}
|
||
|
||
|
||
} |