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;

    }
}

累了,睡觉。