CocosCreator 微信小遊戲、Android 和 iOS 使用 protobuf
阿新 • • 發佈:2021-01-16
技術標籤:cocoscreatorcocos2dx-jsprotobufcocos-creator
protobuf 的介紹這裡就不在講述。本文介紹使用的是 decodeio不是google-protobuf。使用的版本是v6.10.2
mac環境
完成該功能參考了一下文章:
- https://blog.csdn.net/u010799737/article/details/104025745
- https://www.jianshu.com/p/746bb9d81380
- https://blog.csdn.net/weixin_33985507/article/details/91415907
一、安裝 decodeio
- github地址:
- 安裝方式:
sudo npm install protobufjs
- protobufjs 安裝完成後,輸入:
pbjs
命令,等待其安裝完相關元件為止
二、生成 proto 檔案對應的 js
我的專案中有多個 proto 檔案,其中大廳有 request.proto和response.proto 遊戲中也有這兩個檔案。由於微信小遊戲不支援載入的 function 所以本文只用轉換成 js 的形式。
- request.proto : 傳送資料格式
- response.proto: 接收資料格式
request.proto 內容:
// protoc --go_out=. *.proto
syntax = "proto2";
package protobuf;
// 請求命令
message HallRequestCmd {
required HallReqHead head = 1;
}
// 內容
message HallReqHead {
required int32 uid = 1;
required int32 msgID = 2;
required string app = 3;
optional string hallMsg = 4;
}
response.proto 內容:
// protoc --go_out=. *.proto
syntax = "proto2";
package protobuf;
// 響應命令
message HallResponseCmd {
required HallRespHead head = 1;
}
// 響應頭定義
message HallRespHead {
required int32 uid = 1;
required int32 msgID = 2;
required string app = 3;
optional string hallMsg = 4;
}
遊戲的這兩個檔案內容就不在貼出來了,因為內容太多
生成 js 命令
-
生成單個 proto 的 js:
pbjs -t static-module -w commonjs -o request_pb.js request.proto
-
將目錄中的所有 proto 生成一個 js:
pbjs -t static-module -w commonjs -o proto.js *.proto
我的專案中是把一對 request 和 response 生成一個 js,要注意多個 proto 生成一個 js 時 proto 檔案中的訊息名不要相同。如果生成多個 js,要注意 proto 檔案中的 package 不能相同,不然使用的時候找不到對應的訊息
-
將上面生成的 proto.js 檔案拖到專案中
三、使用
let proto = require("../protobuf/proto");
let head = proto.protobuf.HallRequestCmd.create({head: {uid: 123, msgID: 1122, app: "app_123"}}); // 建立訊息
let buffer = proto.protobuf.HallRequestCmd.encode(head).finish(); // 編譯
let msg = proto.protobuf.HallResponseCmd.decode(buffer); // 解碼
console.log("buffer: " + buffer);
console.log("msg: " + JSON.stringify(msg));
列印如下:
使用解碼方法時需要注意 decode
的引數必須是Uint8Array
的資料,websocket 設定的資料格式是arraybuffer
型別1,所以需要做轉換,程式碼如下:
let uint8Data = new Uint8Array(data);
message = build.decode(uint8Data);
WebSocket.binaryType = “arraybuffer”; // 使用二進位制的資料型別 ↩︎