跳至正文

Unity如何使用Protobuf

  • Unity
  • 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在转换时会遵循驼峰命名法,自动把单词首字母变成大写。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注