爲了Creator 3.0 中的 ProtoBuf,我又打開代碼編輯器!

先上個視頻:




在這裏分享一下在 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





本文分享自微信公衆號 - Creator星球遊戲開發社區(creator-star)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章