rp_11009/assets/Main/Scripts/managers/ResManager.ts
2026-04-01 11:10:33 +08:00

65 lines
2.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}
}
}