先上个视频:
在这里分享一下在 Cocos Creator 3.0 中集成 protobufjs 遇到的问题,如果你在 Creator 3.0 中使用其它 JS 三方库,也会有一定的帮助。
1
module 不可用了
Creator 3.0 使用标准的 ES6 语法,代码中不支持 module.exprots = xxx 的方法导出模块。通过调试发现,module 变量已经不在了,而是需要而是使用 ES6 的 export 关键字导出。
2
插件模式遇到的坑
还好的是 protobufjs 支持插件模式,分别 protobufjs 的三个核心文件:
protobuf.js
bytebuffer.js
long.js
在 Creator 3D 中将上面三个文件设置为插件模式,终于可能运行起来了。
但在 decode 时又出现错误,int64 类型的字段解码不了,结果发现是脚本加载顺序引起的问题。
一翻折腾 直接将这三个文件合并成了一个文件才将此问题搞定。
3
API的变化
pbkiller 预加载 proto 文件到内存,然后再使用路径+文件名,同步读取proto 文件内容,通过动态编译为 PBMessage 对象。
但在是 Cocos Creator 3.0 中使用 resources.loadDir 获取到的 Asset 对象,已经没有完整文件名了。
这个问题,折腾了我两天,无赖我只好求教引擎组大神,得到的回复是:在编辑器里面,这个路径就算能拼出来,在运行时也是不可靠的,因为 json 文件可能会被合并,如果不合并 json 的话,那还可以找。
鉴于以上原因 pbkiller for Creator 3.0 这个版本目前将 json 的支持给拿掉了。然后经过我几番尝试,找到了通过 uuid 反查资源 path 的方法通过 asset 获得资源 path。
this.assets.forEach((asset: Asset) => {
if (asset instanceof TextAsset) {
files.push(`${resources.getAssetInfo(asset._uuid).path}.proto`);
}
});
通过 path 同步获取 asset,相互转换。
let asset: Asset = resources.get(path.mainFileName(url), Asset);
console.log(asset.text);
需要注意的是,在 Creator 3.0 中通过路径读取资源时不能带扩展名,你可以从 cc 模块中引出 path 对象,它提供了不少关于文件路径的操作方法。
4
小游戏的坑
在浏览器上运行起来了,但在微信小游戏中还是报错。打开调试,发现合并的 protobuf.js 三个模块又走到 CommonJS 的加载流程中去了。
没有好的办法,只有动源码了,将 protobufjs 中的 AMD、CommonJS 模式的加载代码都移除了,终于在微信小游戏环境运行成功!
4
小结
今天算是初步将 pbkiller 在 Creator 3.0 上的问题搞定,希望上面的内容对你帮助,如果你有好的方案也欢迎留言讨论。
pbkiller for Creator 3.0 以源码案例形式上架 Cocos Store,支持过晓衡 pbkiller 的伙伴可以我微信,提供订单号免费领取!
链接地址:http://store.cocos.com/app/detail/2709