Unity中使用Protobuf进行数据传输
在Unity中使用Protobuf
近期在研究Protobuf进行数据传输,网上很多素材杂七杂八,各种介绍Protobuf的优点(吐槽一点,都主动来学了,好处还用再重复那么多遍吗?)于是无奈自己写一个比较基础的使用方法,深入研究可以先了解基础后自行官网研究(本文以C#举例)。
~1.准备工作
1.官方文档:Protobuf官网(我们用proto3)

2.GitHub下载:GItHub链接
这边我们下载一个Protobuf-CSharp和一个protocWin64

3.Protoc下载完成后我们解压,然后配置Protoc(根目录的bin文件下)的环境变量,以方便我们可以在CMD中使用,具体如何配置环境变量可自行百度(这个是为了方便在CMD中使用)。
这样便是成功了。

4.我们将下载的protobuf-csharp-3.17.3.zip解压后用VS打开。(TIps:路径protobuf-3.17.3\csharp\src)打开后右键Google.Protobuf选择生成Dll给Unity使用

生成好以后我们打开生成路径,将以下所有文件放进Unity中的Plugins文件夹中即可

以上就是准备工作。
~2.操作
因为我们只说一下基础,所以这里就简单达到使用效果。
syntax = "proto3";//使用的协议,我们使用proto3
//package = Test; package对应命名空间
//message 对应Class
//里面一些常用的数据类型官方都有说明,这边不过多赘述
message Person {
//这里a=1并不是给a赋值,而是a的属性顺序号
optional int32 A=1;
string b=2;
//标注包括“required”、“optional”、“repeated”三种,其中
//required表示该属性为必选属性,否则对应的message“未初始化”,debug模式下导致断言,release模式下解析失败;
//optional表示该属性为可选属性,不指定,使用默认值(int或者char数据类型默认为0,string默认为空,
//bool默认为false,嵌套message默认为构造,枚举则为第一个)
//repeated表示该属性为重复字段,可看作是动态数组,类似于C++中的vector。
}
我们可以用txt写,然后将后缀改为Proto,但是我这边直接用的VSCode。
然后我们在当前文件夹运行CMD用指令protoc --csharp_out=OUT_DIR FileName.proto
protoc --csharp_out=. Person.proto
//使用Csharp输出 =后面跟输出路径,"."代表当前路径,然后跟proto文件名+扩展名
运行后生成了一个Person.cs文件,将其拖入Unity中即可使用
~3.序列化和反序列化
using UnityEngine;
using Google.Protobuf;
public class TestOne: MonoBehaviour
{
string jsonMessage;
byte[] buffer;
void 序列化()
{
Person person = new Person();
person.A = 1;
jsonMessage = person.ToString();
buffer = person.ToByteArray();
}
void 反序列化()
{
IMessage iMessage = new Person();
//使用json解析
Person person1 = iMessage.Descriptor.Parser.ParseJson(jsonMessage) as Person;
//使用byte[]解析
Person person2 = iMessage.Descriptor.Parser.ParseFrom(buffer) as Person;
}
}
累了,睡觉。