unity protobuf

整理Unity网络协议模块Protobuf-net生成cs

最近公司项目调整,工作不忙,抽点时间深入学习一下项目的一些基础模块,作为unity开发者,同时也需要了解网络协议模块,首先从后端到前端的过程开始了解,那么就可避免地需要用到proto格式的网络协议,花了一天半时间,从无到有了解,以及使用过程,略有心得(以后用忘了咋整),记录一下下,哈哈哈哈哈哈

protobuf介绍

**(网上文章一大抄,反正不是我写滴)
protocol buffers : 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。
特点: 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。

  • proto文件格式
    protobuf定义协议数据格式是proto,类似于json,是json的效率的3~5倍,那么proto的格式是什么样的呢?
    package : 生成cs文件的命名空间
    message : 代表了一个数据结构单元,是有多个字段组成
    required : 修饰字段,必须显式地赋值,若未赋值在序列化时抛出异常
    optional : 相对于required,被修饰的参数为可选参数,不必初始赋值,默认值是字段数据类型的默认值
    repeated : 数据容器(可以重复),类似于List,ArryList
    标识符 : 每个字段需要有个标识符,第一个字段标识符为1,一次类推增1

例如:

message{
    
    
	required int64 Uuid = 1;
	required int32 Id = 2;
	optional string Name = 3;
	repeated int Score = 4;
}

数据类型

proto type 说明 C++ java python Go Ruby C# PHP Dart
double double double float float64 Float double float double
float float float float float32 Float float float double
int32 使用变长编码。负数的编码效率较低——若字段可能为负值,应使用 sint32 代替。 int32 int int int32 Fixnum or Bignum (as required) int integer int
int64 使用变长编码。负数的编码效率较低——若字段可能为负值,应使用 sint64 代替。 int64 long int/long[3] int64 Bignum long integer/string[5] Int64
uint32 使用变长编码。 uint32 int[1] int/long[3] uint32 Fixnum or Bignum (as required) uint integer int
uint64 使用变长编码。 uint64 long[1] int/long[3] uint64 Bignum ulong integer/string[5] Int64
sint32 使用变长编码。符号整型。负值的编码效率高于常规的 int32 类型。 int32 int int int32 Fixnum or Bignum (as required) int integer int
sint64 使用变长编码。符号整型。负值的编码效率高于常规的 int64 类型。 int64 long int/long[3] int64 Bignum long integer/string[5] Int64
fixed32 定长 4 字节。若值常大于2^28 则会比 uint32 更高效。 uint32 int[1] int/long[3] uint32 Fixnum or Bignum (as required) uint integer int
fixed64 定长 8 字节。若值常大于2^56 则会比 uint64 更高效。 uint64 long[1] int/long[3] uint64 Bignum ulong integer/string[5] Int64
sfixed32 定长 4 字节。 int32 int int int32 Fixnum or Bignum (as required) int integer int
sfixed64 定长 8 字节。 int64 long int/long[3] int64 Bignum long integer/string[5] Int64
bool bool boolean bool bool TrueClass/FalseClass bool boolean bool
string 包含 UTF-8 和 ASCII 编码的字符串,长度不能超过 2^32 。 string String str/unicode[4] string String (UTF-8) string string String
bytes 可包含任意的字节序列但长度不能超过 2^32 。 string ByteString str []byte String (ASCII-8BIT) ByteString string List

下载

github连接 这是源代码,需要重新生成,我未用此连接
Google下载 需要翻墙
可以自行百度下载protobuf&C#相关的文件
下载的自拍文件

解压后目录结构
下载后解压文件
CoreOnly 和Full结构,内容一致,不知道CoreOnly干嘛用,可能涉及到.Net Core相关的东西
Full 主要对应不同框架的protobuf-net.dll(还有个unity被我一移动到protobufTools里了),unity是对应Unity相关的dll文件
Full目录
ProtoGen 主要是protogen.exe,把proto文件转化成C#文件,
protogen
Precompile procompile.exe主要是将protogen.exe生成的cs文件进行序列化成dll文件(在序列化之前还有一步,将在下面指出)
Precompile
unity proto是给unity开发使用,有必要了解一下,其实这个Full文件夹里的其他目录内容差不多
unity

  • 定义的proto文件
    msg.proto文件
//定义通信协议
package protoBufMsg;

message Msg_Test0{
    
    
}
message Msg_Test1{
    
    
   required int32 Id = 1; 
}

msgdb.proto

//定义数据结构
message DBS_Test2{
    
    
   required string Name = 1;
}

重点来了哦!!!

  1. 移动相关文件
    在相应工程同级目录下新文件夹protoc,将Full/unity(Full也可以),ProtoGen,Procompile放到protoc(最好同级目录,这样编写bat批处理文件比较好)
    移动文件
  2. 编写bat批处理文件
    创建txt文件,修改文件名称和格式为:build_proto2cs.bat,将proto转化为cs文件
    bat
rem 将 msg.proto, msgdb.proto合并成一个临时文件temp.proto
type msg.proto>temp.proto
type msgdb.proto>>temp.proto

@echo off
rem 执行protogen.exe,进行转化,了解更多进入protogen.exe所在目录,
rem Shift+鼠标右键打开PowerShell窗口,输入:.\protogen 查看帮助文档
Protogen\protogen.exe -i:.\temp.proto -o:ProtoMessage.cs -p:detectMissing

rem 删除临时文件
del temp.proto

pause

进一步操作,将cs转化为dll文件,给unity使用,创建批处理文件: build_proto2dll.bat
批处理文件

rem 将 msg.proto, msgdb.proto合并成一个临时文件temp.proto
type msg.proto>temp.proto
type msgdb.proto>>temp.proto

@echo off
rem proto生成cs文件 命令窗口可切换到protogen.exe所在目录,.\protogen 查看帮助文档
Protogen\protogen.exe -i:.\temp.proto -o:ProtoMessage.cs -p:detectMissing

rem 删除临时文件
del temp.proto

rem CD表示当前执行的目录
set base_dir=%CD%
set dll_Name=ProtoMessage.dll

rem 拷贝cs文件,做备份
xcopy %base_dir%\*.cs  %base_dir%\..\ProtoBufLib\ /y

rem 获取proto编译器路径
set precomile=\Precompile\precompile.exe
rem csc.exe是C#编译器,将cs生成dll
set csc_make=C:\Windows\Microsoft.NET\Framework\v2.0.50727\csc.exe

rem 将cs文件生成dll文件,/r:引用资源,将protobuf-net.dll并作为引用文件 /out:输出dll名称 /target:library 库文件类型
%csc_make% /r:%base_dir%\unity\protobuf-net.dll /out:%dll_Name% /target:library *.cs

rem 给生成dll附加序列化和反序列化相关代码, -p:含有序列化和反序列化相关代码的附加目录 -t:设置生成dll的命名空间
%base_dir%%precomile% %dll_Name% -o:Serializer_%dll_Name% -p:%base_dir%\unity\ -t:ProtobufSerializer

rem 拷贝到unity工程的plugins文件夹下
rem xcopy %base_dir%\*.cs  %base_dir%\..\ProtoBufLib\ /y
pause
  • 搞定,哈哈哈
    大不是都是参考其他人的文章,加上自己的理解,并非原作,仅做学习使用,拜拜喽
    李欣潼&小肥猪&老肥猪&小老肥&李佳潼

猜你喜欢

转载自blog.csdn.net/qq_32470423/article/details/116242023