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++javapythonGoRubyC#PHPDart
doubledoubledoublefloatfloat64Floatdoublefloatdouble
floatfloatfloatfloatfloat32Floatfloatfloatdouble
int32使用变长编码。负数的编码效率较低——若字段可能为负值,应使用 sint32 代替。int32intintint32Fixnum or Bignum (as required)intintegerint
int64使用变长编码。负数的编码效率较低——若字段可能为负值,应使用 sint64 代替。int64longint/long[3]int64Bignumlonginteger/string[5]Int64
uint32使用变长编码。uint32int[1]int/long[3]uint32Fixnum or Bignum (as required)uintintegerint
uint64使用变长编码。uint64long[1]int/long[3]uint64Bignumulonginteger/string[5]Int64
sint32使用变长编码。符号整型。负值的编码效率高于常规的 int32 类型。int32intintint32Fixnum or Bignum (as required)intintegerint
sint64使用变长编码。符号整型。负值的编码效率高于常规的 int64 类型。int64longint/long[3]int64Bignumlonginteger/string[5]Int64
fixed32定长 4 字节。若值常大于2^28 则会比 uint32 更高效。uint32int[1]int/long[3]uint32Fixnum or Bignum (as required)uintintegerint
fixed64定长 8 字节。若值常大于2^56 则会比 uint64 更高效。uint64long[1]int/long[3]uint64Bignumulonginteger/string[5]Int64
sfixed32定长 4 字节。int32intintint32Fixnum or Bignum (as required)intintegerint
sfixed64定长 8 字节。int64longint/long[3]int64Bignumlonginteger/string[5]Int64
boolboolbooleanboolboolTrueClass/FalseClassboolbooleanbool
string包含 UTF-8 和 ASCII 编码的字符串,长度不能超过 2^32 。stringStringstr/unicode[4]stringString (UTF-8)stringstringString
bytes可包含任意的字节序列但长度不能超过 2^32 。stringByteStringstr[]byteString (ASCII-8BIT)ByteStringstringList

下载

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
  • 搞定,哈哈哈
    大不是都是参考其他人的文章,加上自己的理解,并非原作,仅做学习使用,拜拜喽
    李欣潼&小肥猪&老肥猪&小老肥&李佳潼
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值