找回密码
 立即注册
查看: 296|回复: 0

Protobuf(Protocol Buffer)在Unity中的简单应用

[复制链接]
发表于 2021-10-21 16:16 | 显示全部楼层 |阅读模式
<hr>一.Protobuf的概念
    高效轻便的数据存储格式(序列化和反序列化)。与平台和语言无关。在网络通信和数据存储上应用广泛。
二.Protobuf的工作流
环境安装
    使用Visual Studio2019打开Protobuf源码生成DLL文件,将DLL文件导入Unity。下载Protobuf编译器。
开始使用
    编写协议描述文件*.proto。使用Protobuf编译器将协议描述文件*.proto编译成*.cs文件,将生成的*.cs文件导入Unity。编写脚本实现序列化和反序列化。
下载地址
    Protocol Buffer源代码地址:https://github.com/protocolbuffers/protobufProtocol Buffer编译器地址:https://github.com/protocolbuffers/protobuf/releases/tag/v3.18.1
<hr>三.环境安装

1.生成DLL文件并导入Unity


    下载工程源码后使用Visual Studio 2019打开该文件夹中的解决方案。


    解决方案位置


    打开解决方案后,在资源管理器中找到Google.Protobuf--右键--生成。


    生成Dll


输出窗口提示生成成功。


输出成功

    将工程中的\csharp\src\Google.Protobuf\bin\Debug\net45目录下的所有文件导入Unity。

Dll位置


导入Dll文件

2.下载Protobuf编译器。

    根据需要下载相应平台的编译器并解压到合适位置。

编译器下载

    编译器的执行文件目录为ProtoC\bin\protoc.exe

    编译器执行文件

    到此为止环境安装完成。
<hr>四.开始使用

1.编写协议描述文件。

    新建文本文档更改后缀为.proto,打开文件编辑内容。
文档中关键部分已经注释。更多内容请参考:
官方教程:https://developers.google.com/protocol-buffers/docs/csharptutorial
语法文档:https://developers.google.com/protocol-buffers/docs/proto
//Protobuf版本syntax="proto2";//包名,类似C#中的命名空间package person;//一条message,类似C#中的类message OnePerson{    //[定义声明][数据类型][字段名]=[编号][默认值]    //[定义声明]:required:必填字段;optional:可选字段;repeated:可重复字段    //[数据类型]:字段的类型,与C#稍有不同,更多类型及其说明请参考官网文档.    //[编    号]:唯一标识字段,不可重复,编号1-15使用1个字节进行编码,编号16之后使用两个字节进行编码,推荐将1-15预留给常用的字段,此外编号19000-19999为官方预留,不能使用.    required string name = 1[default = "张三"];    required int64 idNumber = 2[default = 0001];    required genders gender = 3;    optional string profession = 101;[default = "法外狂徒"]}//枚举类型enum genders{       //该参数为true表示允许字段拥有别名,别名使用相同编号.    option allow_alias = true;    man = 0;    boy = 0;    woman = 1;    girl = 1;}2.生成C#脚本文件。

    打开控制台窗口,定位到编译器可执行文件protoc.exe并输入以下命令:
//--proto_path=[输入文件路径] //--csharp_out=[输出文件路径],其中csharp表示输出文件类型为*.cs文件(C#脚本)。 --proto_path=./ ProtobufTest.proto --csharp_out=./

输入命令生成C#文件

    将生成的C#文件导入Unity。

导入Unity

3.使用/测试。

    编写脚本ProtobufTest.cs。
//引入Protobuf命名空间和包名using Google.Protobuf;using Person;public class ProtobufTest : MonoBehaviour{    void Start()    {        //创建OnePerson对象并初始化        OnePerson onePerson = new OnePerson();        onePerson.Name = "张三";        onePerson.IdNumber = 000001;        onePerson.Gender = genders.Man;        onePerson.Profession = "法外狂徒";        //将onePerson对象转换为字节数组        byte[] dataByte = onePerson.ToByteArray();        //...        //将字节数组转换为OnePerson对象        IMessage message = new OnePerson();        OnePerson mySelf = new OnePerson();        mySelf = (OnePerson)message.Descriptor.Parser.ParseFrom(dataByte);        //打印输出        Debug.Log($"My name is:{mySelf.Name}");        Debug.Log($"My idNumber is:{mySelf.IdNumber}");        Debug.Log($"My gender is:{mySelf.Gender}");        Debug.Log($"My profession is:{mySelf.Profession}");    }}

输出打印

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 20:08 , Processed in 0.088437 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表