已解决=请教2.3的cc.loader.downloader.extMap在2.4里面怎么改代码?

  • Creator 版本:2.4.3

  • 目标平台:Android

  • 详细报错信息,包含调用堆栈:

  • 重现方式:直接运行

  • 之前哪个版本是正常的 :2.3.4

源码本身使用fairyGUI,代码里面需要加载这个东西,在ccc2.3.4中代码是:
fgui.addLoadHandler = function (ext) {
var _a, _b;
if (_flag)
return;
_flag = true;
if (!ext)
ext = “bin”;
let extMap = cc.loader.downloader[“extMap”];
cc.log(’**extMap=’,extMap);

    cc.loader.addDownloadHandlers((_a = {}, _a[ext] = extMap.binary, _a));//====报错代码

    cc.loader.addLoadHandlers((_b = {},
        _b[ext] = function (item, callback) {
            item._owner.rawBuffer = item.content;
            return item.content;
        },
        _b));
};

====extMap打印出来是 很多格式的加载函数:

  1. bin: ƒ downloadBinary(item, callback)
  2. binary: ƒ downloadBinary(item, callback)
    报错文本是 Cannot read property ‘binary’ of undefined,
    因为在2.4中cc.loader.downloader已经废弃,自然也就没有extMap变量了,也就不会有extMap.binary了

现在我的问题是我必须要用2.4的版本来打开这个源码了,但是就会报错,我不知道应该怎么去更换api的。
升级文档是说用cc.assetManager.downloader.register来替换addDownloadHandlers,
但是没说明 具体的格式应该怎么替换,我也没找到相关的api。
请问有大佬了解这个方面的吗?麻烦指导一下,谢谢。

cc.assetManager.downloader.register({
    '.zip': cc.assetManager.downloader['_downloaders']['.bin'],
});

https://gitee.com/ifaswind/eazax-ccc/blob/master/core/remote/ZipLoader.ts

陈皮皮大佬你好,我打印的cc.assetManager.downloader里面没有 _downloaders 的,会不会有影响啊?

2.4.6 是有的,你的是什么版本?

可惜 我的是 2.4.3的。
他的报错是 Cannot read property ‘.bin’ of undefined
cc.assetManager.downloader.register({
‘.bin’: cc.assetManager.downloader[’_downloaders’][’.bin’],//报错行数
});
然后我在前面加了一个
if(!cc.assetManager.downloader[’_downloaders’]){
cc.assetManager.downloader[’_downloaders’] = {};
}
但是结果这个地方的报错没有了,但是在后面fgui的东西有别的报错了:
UIPackage.load = function (url,progressBlock,completeBlock) {
cc.loader.loadRes(url,function(err, asset) {
if (err) {
completeBlock(err);
return;
}
if (!asset.rawBuffer)
throw “Missing asset data. Call UIConfig.registerLoader first!”;//=====报错行数
var pkg = new UIPackage();
pkg.loadPackage(new fgui.ByteBuffer(asset.rawBuffer), url);

我看他的源头应该是指asset.rawBuffer这个东西没有的缘故。
我先升级到2.4.6吧。毕竟工作环境是这个 246的客户端早就安装好了的。
之前是用243的开发的。

升 2.4.6 应该没啥风险,干它~

已经升级到246了,算是过了一关了 现在的问题是 新的加载方式变了,又有新的问题了
大佬 请问一下 二进制的类型是怎么写的啊?我现在用246的客户端打开 _downloaders是有了。现在已经进入到项目代码了,FGUtil.load(“gui/load_scene”, null, (error) => {});
对应的 fairygui里面的加载代码是
UIPackage.load = function (url,progressBlock,completeBlock) {
//cc.loader.loadRes(url,function(err, asset) {
cc.log(’**url:’,url);
cc.resources.load(url,function(err, asset) {
if (err) {
cc.log(’**err:’,err);
completeBlock(err);
return;
}
if (!asset.rawBuffer){
throw “Missing asset data. Call UIConfig.registerLoader first!”;
}
。。。。。
}
报错信息是:
download-file.js:74 GET http://localhost:7456/[object%20ArrayBuffer] 404 (Not Found)
load.js:57 download failed: [object ArrayBuffer], status: 404(no response) Error: download failed: [object ArrayBuffer], status: 404(no response)
at XMLHttpRequest.xhr.onload

我正在看代码 应该怎么改。
看api,cc.resources.load(url, 类型,function(err, asset) {});
但是他原版为什么可以不用声明类型就能加载啊,我想着 是不是写个二进制的类型 加载 他就不报错了?

大佬,这个方法在原生上也可以么

我现在 写成 cc.resources.load(url,‘binary’,null,function(err, asset) { }的形式
新的报错是:
**err: Error: Bundle resources doesn’t contain gui/load_scene
at parse (urlTransformer.js:95)
at Pipeline.sync (pipeline.js:257)
at preprocess (preprocess.js:66)
at Pipeline._flow (pipeline.js:308)
at Pipeline.async (pipeline.js:302)
at AssetManager.loadAny (CCAssetManager.js:492)
at Bundle.load (bundle.js:256)
at Function.UIPackage.load (fairygui.js:14644)
at Function.FGUtil.load (eval at (quick_compile.js:238), :58:24)
at LoadScene.loadGUI (eval at (quick_compile.js:238), :72:26)

我感觉是不是类型不能这么写吧
我写成 cc.BufferAsset cc.Asset 的报错:
Error: download failed: [object ArrayBuffer], status: 404(no response)
at XMLHttpRequest.xhr.onload
跟前面一样
如果写成’binary’ 或者cc.JsonAsset 则会是
Error: Bundle resources doesn’t contain gui/load_scene。
奇怪了 不知道应该怎么加载了

我下载了fgui ccc的仓库, 使用据说支持2.4的master分支最新提交,但是也出现你这个错误;

建议此处@fairy作者 @GuZhu

谢谢 已经发私信了

描述一下我现在遇到的问题吧,游戏加载流程如下:
1.主场景LoadScene.ts有个方法调用
FGUtil.load(“gui/load_scene”, null, (error) => {
this.initUI();
})
2.FGUtil里面的load方法内容就是
// 判断是否已加载
if (fgui.UIPackage.getByName(name)) {
if (completeBlock) {
completeBlock(null);
}
return;
}
fgui.addLoadHandler();
fgui.UIPackage.load(name, progressBlock, completeBlock);
3.fgui.UIPackage.load里面的代码前面就是
cc.resources.load(url,cc.BufferAsset,null,function(err, asset) {
if (err) {
cc.log(’**err:’,err);
completeBlock(err);
return;
}
if (!asset.rawBuffer){
throw “Missing asset data. Call UIConfig.registerLoader first!”;
}
此处的asset.rawBuffer在2.4.6里面没有,我用asset._buffer代替了。
4.问题就来了,在fairygui.js里面调用的cc.resources.load,是拿不到东西的,所以会直接报错,
但是如果我在loadScene.ts里面直接运行这个代码是能拿到assets的数据的。
如果我直接在loadScene.ts把fairygui.js里面的加载方法复制一下,不会报错,但是在FGUtil.load中的this.initUI()的代码调用中 有一个 this.main = FGUtil.create(“load_scene”, “load_main”);
明显的 我直接复制运行的代码 并不会把加载的资源写入到fgui的缓存中,则create的时候自然也没有pkgName即"load_scene"可以用的。
我也没学过fairyGUI不知道怎么手动挂载资源进去,然后就卡住了。

已解决 谢谢各位

该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。