在Unity中使用ProtoBuffer进行数值表转换以及生成网络通信用的协议

前言
周末在家中闲着无聊,寻思着业余时间用Unity捣鼓一个联网小游戏,顺便将过程稍作整理,作为笔记。
一、关于数值表转换
在游戏中,数值体系决定了游戏的平衡性,尤其是对于竞技类游戏,如RTS、MOBA等至关重要。对于数值策划而言,Excel表格工具无疑是一个理想的数值表制作工具,其功能强大且操作友好。那么问题来了,我们是否可以直接在游戏中使用Excel作为数值的数据库呢?从技术的角度上讲是可以的,但没人这么做,因为这将会在游戏中引入大量只用于解析Excel文件的库,且直接其解析效率也是一个问题(相对于直接读取二进制文件并反序列化而言)。所以通常的做法是将Excel表格在离线的时候先转化为其它格式(如json,binary,xml等),再在游戏中加载这些转化后的数据。
为了将Excel表格中的数据转化为正确的格式,我们需要一个元数据,用以描述表格中每一列对应的类型和含义,而后由转表工具根据元数据中的描述,生成对应语言(如c++,c#,python等)的数据结构。为此我们选用 protobuffer ,其可以根据定义的.proto文件生成数种语言版本的数据结构。

二、关于通信协议
作为一个联网游戏,自然需要约定服务器和客户端之间通信内容的格式(即协议)。从上面的说明可知,由于PB可以根据同一个.proto文件生成不同语言版本的数据结构,这对于服务器和客户端采用不同语言编写的工程十分有效。对于本文的而言,在Unity中将c#版的数据对象序列化并通过网络发送到服务端,再在服务端用c++版的数据格式反序列化出协议对象,即可解析出协议,十分方便。

三、集成PB到Unity工程中
集成的工作本文主要参考了 [1] ,并在其基础上稍作修改以适应本文工程。
1.获得protoc.exe
方法有两个,一是下载并编译 protobuffer 的源码,由于编译该源码需要再下载googlemock和googletest,为方便直接在 https://github.com/google/protobuf/releases 下载c#版的protobuf,从解压后的代码中copy出googlemock和googletest到protobuf源码目录下,接下来用cmake生成vs2015的工程,编译生成protoc.exe;二是在 https://github.com/google/protobuf/releases 中下载protoc-3.0.0-beta-3-win32.zip(注意要下3.0.0以后的版本)。
PS:protoc3.0.0以上版本可以生成的格式有python,cpp,c#,java等,然而其c#版本需要.net4.5以上,对于只支持.net2.0的unity来说,其生成的c#协议代码并不能使用,为此,选用了第三方修改的版本 protobuf-net (相信后续的unity版本会升级到更高版本的.net,就不用这么麻烦了)。
2.获得protogen
可以在 https://github.com/mgravell/protobuf-net 下载源码自己编译(略麻烦),也可以在 https://code.google.com/archive/p/protobuf-net/downloads 上下载编译好的包(反正只要用protogen来把.proto转成.cs)
3.在Unity中使用
[1] 中指出,因为IOS不允许JIT(Just In Time),只允许AOT(Ahead Of Time),使用protobuf-net\Full\unity\下的protobuf-net.dll拷到Unity工程的Assets\Plugins目录下的方法会报错。所以使用比较简单粗暴的方法,就是直接把源代码代替protobuf-net.dll,拷到Unity工程的Assets\Plugins目录下。(由于编译protobuf-net代码需要unsafe编译,所以还需要在Assets文件夹放入“smcs.rsp”文件,里面加入一行 -unsafe 作为编译参数。)
4.借助 xls_deploy_tool.py 将Excel转化成.proto文件和数据文件
xls_deploy_tool.py 是腾讯魔方工作室jameyli同学的作品,其思路是先通过xls的前4行定义对应的.proto结构,借助xlrd组件解析生成.proto文件;进而通过protoc根据.proto生成python的协议结构;最后将xls文件从第4行开始读取,填入到一个协议生成的对象列表中,再将其序列化到一个数据文件,实现了xls数据到protobuf序列化数据格式的转化。
至此,将PB集成进Unity工程的工序就完成了,接下来是集成的脚本啦。

四、使用
为了整合上面的一系列流程,本文使用python做流程控制,将生成的数据文件以及协议代码分别放置到不同目录,实际使用中只需要将code_cs中的.cs文件放到unity工程中,将code_cpp添加服务器的c++工程即可,或者对此python工程稍作修改,每次生成后自动将其copy相应的目录下并上传到版本控制中,python脚本工程见 代码。

参考文献
[1] http://www.jianshu.com/p/b9b28f034cd8
[2]https://github.com/jameyli/tnt/tree/master/python

你可能感兴趣的:(Unity联网小游戏)