ResLoader.ts 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. import { Asset, AssetManager, assetManager, Constructor, error, js, resources, __private} from "cc";
  2. export type ProgressCallback = ((finished: number, total: number, item: AssetManager.RequestItem) => void) | null;
  3. export type CompleteCallback<T = any> = ((err: Error | null, data: T) => void) | null;
  4. export type CompleteCallbacks<T = any> = ((err: Error | null, data: T[]) => void) | null;
  5. export type IRemoteOptions = { [k: string]: any, ext?: string };
  6. export type AssetType<T = Asset> = Constructor<T>;
  7. interface ILoadResArgs<T extends Asset> {
  8. bundle?: string;
  9. dir?: string;
  10. paths: string;
  11. type: AssetType<T> | null;
  12. onProgress: ProgressCallback | null;
  13. onComplete: CompleteCallback<T> | null;
  14. onCompletes: CompleteCallbacks<T> | null;
  15. }
  16. export default class ResLoader {
  17. /**
  18. * 加载资源包
  19. * @param url 资源地址
  20. * @param complete 完成事件
  21. * @param v 资源MD5版本号
  22. */
  23. loadBundle(url: string, v?: string) {
  24. return new Promise<AssetManager.Bundle>((resolve, reject) => {
  25. assetManager.loadBundle(url, { version: v }, (err, bundle: AssetManager.Bundle) => {
  26. if (err) {
  27. return error(err);
  28. }
  29. resolve(bundle);
  30. });
  31. });
  32. }
  33. parseLoadResArgs<T extends Asset>(
  34. paths: string | string[],
  35. type?: AssetType<T> | ProgressCallback | CompleteCallback |CompleteCallbacks| null,
  36. onProgress?: AssetType<T> | ProgressCallback | CompleteCallback | CompleteCallbacks|null,
  37. onComplete?: ProgressCallback | CompleteCallback | CompleteCallbacks|null
  38. ) {
  39. let pathsOut: any = paths;
  40. let typeOut: any = type;
  41. let onProgressOut: any = onProgress;
  42. let onCompleteOut: any = onComplete;
  43. let onCompleteOuts: any = null;
  44. if (onComplete === undefined) {
  45. const isValidType = js.isChildClassOf(type as AssetType, Asset);
  46. if (onProgress) {
  47. onCompleteOut = onProgress as CompleteCallback;
  48. if (isValidType) {
  49. onProgressOut = null;
  50. }
  51. } else if (onProgress === undefined && !isValidType) {
  52. onCompleteOut = type as CompleteCallback;
  53. if(onCompleteOut){
  54. onCompleteOuts = null;
  55. }
  56. else {
  57. onCompleteOuts = type as CompleteCallbacks;
  58. }
  59. onProgressOut = null;
  60. typeOut = null;
  61. }
  62. if (onProgress !== undefined && !isValidType) {
  63. onProgressOut = type as ProgressCallback;
  64. typeOut = null;
  65. }
  66. }
  67. else{
  68. onCompleteOut = type as CompleteCallback;
  69. if(onCompleteOut){
  70. onCompleteOuts = null;
  71. }
  72. else {
  73. onCompleteOuts = type as CompleteCallbacks;
  74. }
  75. }
  76. return { paths: pathsOut, type: typeOut, onProgress: onProgressOut, onComplete: onCompleteOut,onCompletes: onCompleteOuts };
  77. }
  78. private loadByBundleAndArgs<T extends Asset>(bundle: AssetManager.Bundle, args: ILoadResArgs<T>): void {
  79. if (args.dir) {
  80. bundle.loadDir(args.paths as string, args.type, args.onProgress, args.onCompletes);
  81. } else {
  82. if (typeof args.paths == 'string') {
  83. bundle.load(args.paths, args.type, args.onProgress, args.onComplete);
  84. } else {
  85. bundle.load(args.paths, args.type, args.onProgress, args.onCompletes);
  86. }
  87. }
  88. }
  89. private loadByArgs<T extends Asset>(args: ILoadResArgs<T>) {
  90. if (args.bundle) {
  91. if (assetManager.bundles.has(args.bundle)) {
  92. let bundle = assetManager.bundles.get(args.bundle);
  93. this.loadByBundleAndArgs(bundle!, args);
  94. } else {
  95. // 自动加载bundle
  96. assetManager.loadBundle(args.bundle, (err, bundle) => {
  97. if (!err) {
  98. this.loadByBundleAndArgs(bundle, args);
  99. }
  100. })
  101. }
  102. } else {
  103. this.loadByBundleAndArgs(resources, args);
  104. }
  105. }
  106. preload(bundleName: string, url: string, type: typeof Asset) {
  107. if (bundleName) {
  108. if (assetManager.bundles.has(bundleName)) {
  109. let bundle = assetManager.bundles.get(bundleName);
  110. bundle.preload(url, type);
  111. } else {
  112. assetManager.loadBundle(bundleName, (error: Error, bundle: AssetManager.Bundle) => {
  113. if (!error) {
  114. bundle.preload(url, type);
  115. }
  116. })
  117. }
  118. } else {
  119. resources.preload(url, type);
  120. }
  121. }
  122. load<T extends Asset>(bundleName: string, paths: string | string[], type: AssetType<T> | null, onProgress: ProgressCallback | null, onComplete: CompleteCallback<T> | null): void;
  123. load<T extends Asset>(bundleName: string, paths: string | string[], onProgress: ProgressCallback | null, onComplete: CompleteCallback<T> | null): void;
  124. load<T extends Asset>(bundleName: string, paths: string | string[], onComplete?: CompleteCallback<T> | null): void;
  125. load<T extends Asset>(bundleName: string, paths: string | string[], type: AssetType<T> | null, onComplete?: CompleteCallback<T> | null): void;
  126. load<T extends Asset>(paths: string | string[], type: AssetType<T> | null, onProgress: ProgressCallback | null, onComplete: CompleteCallback<T> | null): void;
  127. load<T extends Asset>(paths: string | string[], onProgress: ProgressCallback | null, onComplete: CompleteCallback<T> | null): void;
  128. load<T extends Asset>(paths: string | string[], onComplete?: CompleteCallback<T> | null): void;
  129. load<T extends Asset>(paths: string | string[], type: AssetType<T> | null, onComplete?: CompleteCallback<T> | null): void;
  130. load<T extends Asset>(
  131. bundleName: string,
  132. paths?: string | string[] | AssetType<T> | ProgressCallback | CompleteCallback | null,
  133. type?: AssetType<T> | ProgressCallback | CompleteCallback | null,
  134. onProgress?: ProgressCallback | CompleteCallback | null,
  135. onComplete?: CompleteCallback | null,
  136. ) {
  137. let args: ILoadResArgs<T> | null = null;
  138. if (typeof paths === "string" || paths instanceof Array) {
  139. args = this.parseLoadResArgs(paths, type, onProgress, onComplete);
  140. args.bundle = bundleName;
  141. } else {
  142. args = this.parseLoadResArgs(bundleName, paths, type, onProgress);
  143. }
  144. this.loadByArgs(args);
  145. }
  146. loadDir<T extends Asset>(bundleName: string, dir: string, type: AssetType<T> | null, onProgress: ProgressCallback | null, onComplete: CompleteCallback<T[]> | null): void;
  147. loadDir<T extends Asset>(bundleName: string, dir: string, onProgress: ProgressCallback | null, onComplete: CompleteCallback<T[]> | null): void;
  148. loadDir<T extends Asset>(bundleName: string, dir: string, onComplete?: CompleteCallback<T[]> | null): void;
  149. loadDir<T extends Asset>(bundleName: string, dir: string, type: AssetType<T> | null, onComplete?: CompleteCallback<T[]> | null): void;
  150. loadDir<T extends Asset>(dir: string, type: AssetType<T> | null, onProgress: ProgressCallback | null, onComplete: CompleteCallback<T[]> | null): void;
  151. loadDir<T extends Asset>(dir: string, onProgress: ProgressCallback | null, onComplete: CompleteCallback<T[]> | null): void;
  152. loadDir<T extends Asset>(dir: string, onComplete?: CompleteCallback<T[]> | null): void;
  153. loadDir<T extends Asset>(dir: string, type: AssetType<T> | null, onComplete?: CompleteCallback<T[]> | null): void;
  154. loadDir<T extends Asset>(
  155. bundleName: string,
  156. dir?: string | AssetType<T> | ProgressCallback | CompleteCallback | null,
  157. type?: AssetType<T> | ProgressCallback | CompleteCallback | null,
  158. onProgress?: ProgressCallback | CompleteCallback | null,
  159. onComplete?: CompleteCallback | null,
  160. ) {
  161. let args: ILoadResArgs<T> | null = null;
  162. if (typeof dir === "string") {
  163. args = this.parseLoadResArgs(dir, type, onProgress, onComplete);
  164. args.bundle = bundleName;
  165. } else {
  166. args = this.parseLoadResArgs(bundleName, dir, type, onProgress);
  167. }
  168. args.dir = args.paths as string;
  169. this.loadByArgs(args);
  170. }
  171. loadRemote<T extends Asset>(url: string, options: IRemoteOptions | null, onComplete?: CompleteCallback<T> | null): void;
  172. loadRemote<T extends Asset>(url: string, onComplete?: CompleteCallback<T> | null): void;
  173. loadRemote(url: string, ...args: any): void {
  174. assetManager.loadRemote(url, args);
  175. }
  176. release(path: string, bundleName: string = "resources") {
  177. let bundle = assetManager.getBundle(bundleName);
  178. bundle?.release(path);
  179. }
  180. releaseDir(path: string, bundleName: string = "resources") {
  181. let bundle: AssetManager.Bundle | null = assetManager.getBundle(bundleName);
  182. let infos = bundle?.getDirWithPath(path);
  183. infos?.map(function (info) {
  184. let asset = assetManager.assets.get(info.uuid)!;
  185. assetManager.releaseAsset(asset);
  186. });
  187. if (path == "" && bundleName != "resources" && bundle) {
  188. assetManager.removeBundle(bundle);
  189. }
  190. }
  191. get<T extends Asset>(path: string, type?: __private.__types_globals__Constructor<T> | null, bundleName: string = "resources"): T | null {
  192. let bundle: AssetManager.Bundle | null = assetManager.getBundle(bundleName);
  193. return bundle!.get(path, type);
  194. }
  195. dump() {
  196. assetManager.assets.forEach((value: Asset, key: string) => {
  197. console.log(key);
  198. })
  199. console.log(`当前资源总数:${assetManager.assets.count}`);
  200. }
  201. }
  202. export let resLoader = new ResLoader();