Asset Bundle
功能下 loadDir
的困惑
处于自己的写的代码用起来得心应手这种考虑,对加载文件夹中的资源方法 loadDir
进行了封装,然后在使用的时候遇到了点小问题。
// 封装代码
loadDir(
path: string, bundleName: string,
progressCallback?: (cur, total) => void,
completeCallback?: (err, assets) => void): void {
// .......
let bundle = cc.assetManager.getBundle(bundleName);
bundle.loadDir(path, cc.Asset, progressCallback, completeCallback);
}
// 调用代码
useLoadDir(): void {
loadDir("xxx", "resource", (cur: number, total: number) => {
// ...进度展示逻辑
});
}
代码在执行的时候却不大对劲,cur = undefined
、total = Array(2)
,类型和值和预期完全不符。不应该是 progressCallback
应该有的参数,反倒和 completeCallback
的参数能对应上。
打开 cocos
源码找到 Asset Bundle
功能对应的代码,查找是哪里不大对劲儿导致这样。
源码展示部分:
// bundle.js
loadDir: function loadDir(dir, type, onProgress, onComplete) {
var _parseLoadResArgs3 = parseLoadResArgs(type, onProgress, onComplete),
type = _parseLoadResArgs3.type,
onProgress = _parseLoadResArgs3.onProgress,
onComplete = _parseLoadResArgs3.onComplete;
cc.assetManager.loadAny(dir, {
__requestType__: RequestType.DIR,
type: type,
bundle: this.name,
__outputAsArray__: true
}, onProgress, onComplete);
},
// utillities.js
parseLoadResArgs: function parseLoadResArgs(type, onProgress, onComplete) {
if (onComplete === undefined) {
var isValidType = cc.js.isChildClassOf(type, cc.Asset);
if (onProgress) {
onComplete = onProgress;
if (isValidType) {
onProgress = null;
}
} else if (onProgress === undefined && !isValidType) {
onComplete = type;
onProgress = null;
type = null;
}
if (onProgress !== undefined && !isValidType) {
onProgress = type;
type = null;
}
}
return {
type: type,
onProgress: onProgress,
onComplete: onComplete
};
},
理解如下:
封装的方法调用的时候实参:xxx
、resource
、 (cur,total)=>{...}
、undefined
,执行到源码中 parseLoadResArgs
函数的时候,由于缺少 onComplete
参数传入,就把 onProgress
入参当做 onComplete
的值了。这里居然拿前面的参数的值当做后面参数的值,实在是有些出乎意料了。讲道理,正常应该是按顺序一一对应的。
如何改:
避免 onComplete
的值 undefined
就可以了。
loadDir(
path: string, bundleName: string,
progressCallback: (cur, total) => void = null,
completeCallback: (err, assets) => void = null): void {
// .......
let bundle = cc.assetManager.getBundle(bundleName);
bundle.loadDir(path, cc.Asset, progressCallback, completeCallback);
}
文章写的少,如果有哪里措辞不合适的地方还请见谅。然后有错误的地方还请一定留言通知我,感激不尽。