- 博主使用Unity和Protobuf版本
Unity2020.3.37f1c1
Visual Studio 2019
Google.ProtoBuf插件版本:3.26.1
protobuf-26.1
- Protobuf作用
Protobuf是Protocol Buffers的简称,它是Google公司开发的一种轻便高效的结构化数据存储格式,可以用于结构数据序列化。proto2中提供了C++、Java、Python三种语言的API。在proto3中支持所有的语言。主要用于通信协议中数据传输、数据存储等。
在旧的Unity版本中只支持proto2(好像是Unity2018之前,这个不太确定哈),新Unity版本支持proto3,本篇只讲解新版本支持proto3的情况,旧版本会顺带提一下
- Protobuf优点
同XML相比, Protobuf在序列化和反序列化方面有许多优点:
1、数据描述文件只需原来的1/10至1/3;
2、解析速度是原来的20倍至100倍;
3、支持多种编程语言
4、序列化后体积相比Json和XML更小,适合网络传输
5、序列化和反序列化速度很快,快于Json的处理速度
- 准备阶段
1、确保你的Unity API版本级别为 ·NET Standard2.0或2.1或者更高,设置路径如下:
Unity中Editor-->Project Settings-->Player-->Other Settings 中Api Compatibility Level设置为·Net Standard2.0或2.1,本博主的为2.0
2、在VS中安装Google ProtoBuf插件:在Unity中新建一个脚本,起名为Test.cs,并挂在Camera上,用vs打开
VS中打开 工具-->NuGet包管理器--> 管理解决方案的NuGet程序包,如下图:
"浏览"选项-->搜索“Google Protobuf”-->选择第一个“Google.ProtoBuf”-->此时右侧会出现“最新稳定版3.26.1 Assembly-CSharp”-->勾选“Assembly-CSharp”选项-->点击“安装”进行安装
出现下图,表示安装成功
3、第2步安装成功后,打开Unity 中Packages文件夹
分别把
.\Packages\Google.Protobuf.3.26.1\lib\netstandard2.0\Google.Protobuf.dll
.\Packages\System.Buffers.4.4.0\lib\netstandard2.0\System.Buffers.dll
.\Packages\System.Memory.4.5.3\lib\netstandard2.0\System.Memory.dll
.\Packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll
这几个dll文件放在Assets/Plugins文件夹中,等待unity重新编译注意:这里选择netstandard2.0文件夹下的,也是和上面的Unity API对应,如果你的Unity API是2.1版本的那就选择netstandard2.1文件下的几个dll
到这一步,你在Unity中的脚本中就可以引用到Google.ProtoBuf的命名空间了,如下图:
这就意味着你已经可以使用Google ProtoBuffer进行序列化和反序列化了
4、还需要在https://github.com/protocolbuffers/protobuf/releases上下载一个ProtoBuf工具exe文件:protoc-26.1-win64.zip
注意: protoc-26.1-win64.zip和上面VS中NuGet包管理器安装的Assembly-CSharp是配套版本,同学们若要选用其他版本可以自由选择,但要记住二者要配套使用
至此准备阶段的工作已做完,下面开始使用。
- ProtoBuf工具使用
1、按照ProtoBuffer语法编写Model类,新建一个·proto文件的Model类,起名StudentModel.proto
新建一个txt文档,将扩展名改为·proto,便可得proto文件
syntax="proto3"; //指定了正在使用proto3语法,如果没指定编译器默认使用proto2语法
package WYDGoogleProtoBuff; //等于C#中命名空间
message StudentModel //等于C#中的类名
{
string name=1; //姓名
int32 age=2; //年龄
string sex=3; //性别
float height=4;//身高
bool isGraduate=5; //是否已毕业
}
注:在旧版本的Unity中只支持syntax="proto2"的语法,新版本Unity 中可支持syntax="proto3"
2、使用 protoc-26.1-win64.zip中的protoc.exe工具对上面的Model类进行编译,这里我们自己编写一个bat命令调起exe工具对Model类进行编译
新建一个.bat文件,起名ModelBat.bat,文件中写入如下代码
protoc.exe --proto_path= ./StudentModel.proto --csharp_out=./
注:需将此.bat命令文件和StudentModel.proto两个文件放到与proto.exe同文件夹下,如下图
双击运行.bat文件,即可生成Uunity可用的被编译后的Model类,如下图:
被编译后的Model类如下:
Name、Age等字段都被编译进去了
将编译好的StudentModel.cs放在Unity里即可像平常的Model类一样直接使用,如下图:
3、到此一步用ProtoBuf工具编译编译好的Model类就可以像平常的Model类一样直接使用了,编译后的Model类用在网络传输数据方面非常优越,比普通的数据流性能要好的多,打开刚才新建的Test.cs脚本,记得引入Model类中的命名空间即可使用。
4、若要想将此Model类数据通过Socket传给服务器,还需要将此Model类序列化数据流,到服务器再反序列化,Google ProtoBuffer编译后的数据序列化为数据流要比普通数据直接序列化为数据流要小得多,传输也快得多,这里我们自己写一个序列化和反序列化的脚本工具,记得引用Google.Protobuf命名空间,如下:
至此,使用Google Protobuffer编译和反编译数据类到此完成,同学们有什么疑问评论区留言即可。