Cocos Asset Bundle 功能下 loadDir 的小困惑

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 = undefinedtotal = 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
    };
},

理解如下:

封装的方法调用的时候实参:xxxresource(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);
}

文章写的少,如果有哪里措辞不合适的地方还请见谅。然后有错误的地方还请一定留言通知我,感激不尽。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逗比的手艺人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值