123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- import { Asset, AssetManager, assetManager, Constructor, error, js, resources, __private} from "cc";
- export type ProgressCallback = ((finished: number, total: number, item: AssetManager.RequestItem) => void) | null;
- export type CompleteCallback<T = any> = ((err: Error | null, data: T) => void) | null;
- export type CompleteCallbacks<T = any> = ((err: Error | null, data: T[]) => void) | null;
- export type IRemoteOptions = { [k: string]: any, ext?: string };
- export type AssetType<T = Asset> = Constructor<T>;
- interface ILoadResArgs<T extends Asset> {
- bundle?: string;
- dir?: string;
- paths: string;
- type: AssetType<T> | null;
- onProgress: ProgressCallback | null;
- onComplete: CompleteCallback<T> | null;
- onCompletes: CompleteCallbacks<T> | null;
- }
- export default class ResLoader {
- /**
- * 加载资源包
- * @param url 资源地址
- * @param complete 完成事件
- * @param v 资源MD5版本号
- */
- loadBundle(url: string, v?: string) {
- return new Promise<AssetManager.Bundle>((resolve, reject) => {
- assetManager.loadBundle(url, { version: v }, (err, bundle: AssetManager.Bundle) => {
- if (err) {
- return error(err);
- }
- resolve(bundle);
- });
- });
- }
- parseLoadResArgs<T extends Asset>(
- paths: string | string[],
- type?: AssetType<T> | ProgressCallback | CompleteCallback |CompleteCallbacks| null,
- onProgress?: AssetType<T> | ProgressCallback | CompleteCallback | CompleteCallbacks|null,
- onComplete?: ProgressCallback | CompleteCallback | CompleteCallbacks|null
- ) {
- let pathsOut: any = paths;
- let typeOut: any = type;
- let onProgressOut: any = onProgress;
- let onCompleteOut: any = onComplete;
- let onCompleteOuts: any = null;
- if (onComplete === undefined) {
- const isValidType = js.isChildClassOf(type as AssetType, Asset);
- if (onProgress) {
- onCompleteOut = onProgress as CompleteCallback;
- if (isValidType) {
- onProgressOut = null;
- }
- } else if (onProgress === undefined && !isValidType) {
- onCompleteOut = type as CompleteCallback;
- if(onCompleteOut){
- onCompleteOuts = null;
- }
- else {
- onCompleteOuts = type as CompleteCallbacks;
- }
-
- onProgressOut = null;
- typeOut = null;
- }
- if (onProgress !== undefined && !isValidType) {
- onProgressOut = type as ProgressCallback;
- typeOut = null;
- }
- }
- else{
- onCompleteOut = type as CompleteCallback;
- if(onCompleteOut){
- onCompleteOuts = null;
- }
- else {
- onCompleteOuts = type as CompleteCallbacks;
- }
- }
- return { paths: pathsOut, type: typeOut, onProgress: onProgressOut, onComplete: onCompleteOut,onCompletes: onCompleteOuts };
- }
- private loadByBundleAndArgs<T extends Asset>(bundle: AssetManager.Bundle, args: ILoadResArgs<T>): void {
- if (args.dir) {
- bundle.loadDir(args.paths as string, args.type, args.onProgress, args.onCompletes);
- } else {
- if (typeof args.paths == 'string') {
- bundle.load(args.paths, args.type, args.onProgress, args.onComplete);
- } else {
- bundle.load(args.paths, args.type, args.onProgress, args.onCompletes);
- }
- }
- }
- private loadByArgs<T extends Asset>(args: ILoadResArgs<T>) {
- if (args.bundle) {
- if (assetManager.bundles.has(args.bundle)) {
- let bundle = assetManager.bundles.get(args.bundle);
- this.loadByBundleAndArgs(bundle!, args);
- } else {
- // 自动加载bundle
- assetManager.loadBundle(args.bundle, (err, bundle) => {
- if (!err) {
- this.loadByBundleAndArgs(bundle, args);
- }
- })
- }
- } else {
- this.loadByBundleAndArgs(resources, args);
- }
- }
- preload(bundleName: string, url: string, type: typeof Asset) {
- if (bundleName) {
- if (assetManager.bundles.has(bundleName)) {
- let bundle = assetManager.bundles.get(bundleName);
- bundle.preload(url, type);
- } else {
- assetManager.loadBundle(bundleName, (error: Error, bundle: AssetManager.Bundle) => {
- if (!error) {
- bundle.preload(url, type);
- }
- })
- }
- } else {
- resources.preload(url, type);
- }
- }
- load<T extends Asset>(bundleName: string, paths: string | string[], type: AssetType<T> | null, onProgress: ProgressCallback | null, onComplete: CompleteCallback<T> | null): void;
- load<T extends Asset>(bundleName: string, paths: string | string[], onProgress: ProgressCallback | null, onComplete: CompleteCallback<T> | null): void;
- load<T extends Asset>(bundleName: string, paths: string | string[], onComplete?: CompleteCallback<T> | null): void;
- load<T extends Asset>(bundleName: string, paths: string | string[], type: AssetType<T> | null, onComplete?: CompleteCallback<T> | null): void;
- load<T extends Asset>(paths: string | string[], type: AssetType<T> | null, onProgress: ProgressCallback | null, onComplete: CompleteCallback<T> | null): void;
- load<T extends Asset>(paths: string | string[], onProgress: ProgressCallback | null, onComplete: CompleteCallback<T> | null): void;
- load<T extends Asset>(paths: string | string[], onComplete?: CompleteCallback<T> | null): void;
- load<T extends Asset>(paths: string | string[], type: AssetType<T> | null, onComplete?: CompleteCallback<T> | null): void;
- load<T extends Asset>(
- bundleName: string,
- paths?: string | string[] | AssetType<T> | ProgressCallback | CompleteCallback | null,
- type?: AssetType<T> | ProgressCallback | CompleteCallback | null,
- onProgress?: ProgressCallback | CompleteCallback | null,
- onComplete?: CompleteCallback | null,
- ) {
- let args: ILoadResArgs<T> | null = null;
- if (typeof paths === "string" || paths instanceof Array) {
- args = this.parseLoadResArgs(paths, type, onProgress, onComplete);
- args.bundle = bundleName;
- } else {
- args = this.parseLoadResArgs(bundleName, paths, type, onProgress);
- }
- this.loadByArgs(args);
- }
- loadDir<T extends Asset>(bundleName: string, dir: string, type: AssetType<T> | null, onProgress: ProgressCallback | null, onComplete: CompleteCallback<T[]> | null): void;
- loadDir<T extends Asset>(bundleName: string, dir: string, onProgress: ProgressCallback | null, onComplete: CompleteCallback<T[]> | null): void;
- loadDir<T extends Asset>(bundleName: string, dir: string, onComplete?: CompleteCallback<T[]> | null): void;
- loadDir<T extends Asset>(bundleName: string, dir: string, type: AssetType<T> | null, onComplete?: CompleteCallback<T[]> | null): void;
- loadDir<T extends Asset>(dir: string, type: AssetType<T> | null, onProgress: ProgressCallback | null, onComplete: CompleteCallback<T[]> | null): void;
- loadDir<T extends Asset>(dir: string, onProgress: ProgressCallback | null, onComplete: CompleteCallback<T[]> | null): void;
- loadDir<T extends Asset>(dir: string, onComplete?: CompleteCallback<T[]> | null): void;
- loadDir<T extends Asset>(dir: string, type: AssetType<T> | null, onComplete?: CompleteCallback<T[]> | null): void;
- loadDir<T extends Asset>(
- bundleName: string,
- dir?: string | AssetType<T> | ProgressCallback | CompleteCallback | null,
- type?: AssetType<T> | ProgressCallback | CompleteCallback | null,
- onProgress?: ProgressCallback | CompleteCallback | null,
- onComplete?: CompleteCallback | null,
- ) {
- let args: ILoadResArgs<T> | null = null;
- if (typeof dir === "string") {
- args = this.parseLoadResArgs(dir, type, onProgress, onComplete);
- args.bundle = bundleName;
- } else {
- args = this.parseLoadResArgs(bundleName, dir, type, onProgress);
- }
- args.dir = args.paths as string;
- this.loadByArgs(args);
- }
- loadRemote<T extends Asset>(url: string, options: IRemoteOptions | null, onComplete?: CompleteCallback<T> | null): void;
- loadRemote<T extends Asset>(url: string, onComplete?: CompleteCallback<T> | null): void;
- loadRemote(url: string, ...args: any): void {
- assetManager.loadRemote(url, args);
- }
- release(path: string, bundleName: string = "resources") {
- let bundle = assetManager.getBundle(bundleName);
- bundle?.release(path);
- }
- releaseDir(path: string, bundleName: string = "resources") {
- let bundle: AssetManager.Bundle | null = assetManager.getBundle(bundleName);
- let infos = bundle?.getDirWithPath(path);
- infos?.map(function (info) {
- let asset = assetManager.assets.get(info.uuid)!;
- assetManager.releaseAsset(asset);
- });
- if (path == "" && bundleName != "resources" && bundle) {
- assetManager.removeBundle(bundle);
- }
- }
- get<T extends Asset>(path: string, type?: __private.__types_globals__Constructor<T> | null, bundleName: string = "resources"): T | null {
- let bundle: AssetManager.Bundle | null = assetManager.getBundle(bundleName);
- return bundle!.get(path, type);
- }
- dump() {
- assetManager.assets.forEach((value: Asset, key: string) => {
- console.log(key);
- })
- console.log(`当前资源总数:${assetManager.assets.count}`);
- }
- }
- export let resLoader = new ResLoader();
|