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