Unity如何使用Protobuf

  • Unity版本:2018.4.17
  • Protobuf版本:3.4 (下載地址

Protobuf是一種高效輕便的數據格式,跟平臺和語言無關,在網絡通信和數據存儲中應用非常廣泛。

Unity中使用需要按照Protobuf的語法規範,先定義好Proto文件,然後用Protobuf官方工具把Proto文件轉換成C#文件,再把該C#文件和Protobuf庫文件導入到Unity中就可以用了。

定義Proto文件

下載protobuf包後,在Proto目錄新建一個Proto文件,名爲Request.Proto,內容如下

syntax = "proto3"; // proto協議版本
package Proto.Request; // 包名,相當於C#的namespace

message RequestMsg  // RequestMsg相當於C#的類名
{
    string name = 1;
    int32 len = 2;
	repeated int32 buff = 3; // 數組,相當於C#的List
} 

之後雙擊run.bat,在cs目錄下生成對應的Request.cs文件。

在Unity中使用

把上一步生成的Request.csGoogle.Protobuf.dll放入到項目的Assets目錄下,如果Unity沒有報錯,說明可以用了。

先在代碼裏引入命名空間

using Google.Protobuf
using Proto.Request;

然後編寫測試代碼如下

RequestMsg reqMsg = new RequestMsg();
reqMsg.Name = "123";
reqMsg.Len = 100;
for (int i = 0; i < 10; i++) 
{
    reqMsg.Buff.Add(i); // 設置List
}
byte[] datas = reqMsg.ToByteArray(); // 把對象轉換爲字節數組

// 把字節數組還原爲對象
IMessage imsg = new RequestMsg();
RequestMsg resp = new RequestMsg();
resp = (RequestMsg)imsg.Descriptor.Parser.ParseFrom(datas);
string name = resp.Name; // "123"
int len = resp.Len; // 100
for (int i = 0; i < 10; i++) 
{
    Debug.Log(resp.Buff[i]); // 還原List
}

需要注意的一個細節是,即使Proto文件定義的成員名是小寫字母開頭,如 name,在C#代碼中也應該用 Name,因爲Protobuf在轉換時會遵循駝峯命名法,自動把單詞首字母變成大寫。

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