在這裏分享一下在 Cocos Creator 3.0 中集成 protobufjs 遇到的問題,如果你在 Creator 3.0 中使用其它 JS 三方庫,也會有一定的幫助。
Creator 3.0 使用標準的 ES6 語法,代碼中不支持
module.exprots = xxx
的方法導出模塊。
通過調試發現,module 變量已經不在了,而是需要而是使用 ES6 的 export 關鍵字導出。
還好的是 protobufjs 支持插件模式,
分別 protobufjs 的三個核心文件:
protobuf.js
bytebuffer.js
long.js
在 Creator 3D 中將上面三個文件設置爲插件模式,終於可能運行起來了。
但在 decode 時又出現錯誤,int64 類型的字段解碼不了,結果發現是腳本加載順序引起的問題。
一翻折騰 直接將這三個文件合併成了一個文件纔將此問題搞定。
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 對象,它提供了不少關於文件路徑的操作方法。
在瀏覽器上運行起來了,但在微信小遊戲中還是報錯。打開調試,發現合併的 protobuf.js 三個模塊又走到 CommonJS 的加載流程中去了。
沒有好的辦法,只有動源碼了,將 protobufjs 中的 AMD、CommonJS 模式的加載代碼都移除了,終於在微信小遊戲環境運行成功!
今天算是初步將 pbkiller 在 Creator 3.0 上的問題搞定,希望上面的內容對你幫助,如果你有好的方案也歡迎留言討論。
pbkiller for Creator 3.0 以源碼案例形式上架 Cocos Store,支持過曉衡 pbkiller 的夥伴可以我微信,提供訂單號免費領取!
鏈接地址:http://store.cocos.com/app/detail/2709