BundleMgr.ts 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import { assetManager, AssetManager } from "cc";
  2. /**
  3. * 分包管理器
  4. * 提供分包加载、获取、移除功能。
  5. */
  6. class BundleMgr {
  7. /** 私有构造函数*/
  8. private constructor() { }
  9. /** 单例实例 */
  10. public static readonly instance: BundleMgr = new BundleMgr();
  11. /**
  12. * 获取指定分包,如果未加载则进行加载。
  13. * @param nameOrUrl - 分包名称或URL。
  14. * @param onProgress - 进度回调函数。
  15. * @returns Promise<AssetManager.Bundle | null> - 加载完成后的Promise。
  16. */
  17. public async getBundle(nameOrUrl: string, onProgress?: (progress: number) => void): Promise<AssetManager.Bundle | null> {
  18. const bundle = assetManager.getBundle(nameOrUrl);
  19. if (bundle) return bundle;
  20. try {
  21. const loadedBundle = await this.loadBundle(nameOrUrl);
  22. if (onProgress) {
  23. await this.loadAssetsWithProgress(loadedBundle, onProgress);
  24. }
  25. return loadedBundle;
  26. } catch (error) {
  27. console.error(`分包 ${nameOrUrl} 加载失败`, error.message);
  28. return null;
  29. }
  30. }
  31. /**
  32. * 加载指定分包。
  33. * @param nameOrUrl - 分包名称或URL。
  34. * @returns Promise<AssetManager.Bundle> - 加载完成后的Promise。
  35. */
  36. private loadBundle(nameOrUrl: string): Promise<AssetManager.Bundle> {
  37. return new Promise((resolve, reject) => {
  38. assetManager.loadBundle(nameOrUrl, (err, loadedBundle) => {
  39. if (err) {
  40. reject(err);
  41. } else {
  42. resolve(loadedBundle);
  43. }
  44. });
  45. });
  46. }
  47. /**
  48. * 加载分包中的资源并提供进度反馈。
  49. * @param bundle - 已加载的分包。
  50. * @param onProgress - 进度回调函数。
  51. * @returns Promise<void> - 加载完成后的Promise。
  52. */
  53. private loadAssetsWithProgress(bundle: AssetManager.Bundle, onProgress: (progress: number) => void): Promise<void> {
  54. return new Promise((resolve, reject) => {
  55. const assets = bundle.getDirWithPath('');
  56. const totalAssets = assets.length;
  57. let loadedAssets = 0;
  58. if (totalAssets === 0) {
  59. onProgress(1);
  60. resolve();
  61. return;
  62. }
  63. assets.forEach((asset) => {
  64. bundle.load(asset.path, (err) => {
  65. if (err) {
  66. reject(err);
  67. return;
  68. }
  69. loadedAssets++;
  70. onProgress(loadedAssets / totalAssets);
  71. if (loadedAssets === totalAssets) {
  72. resolve();
  73. }
  74. });
  75. });
  76. });
  77. }
  78. }
  79. /** 分包管理器实例 */
  80. export const bundleMgr = BundleMgr.instance;