在Unity中使用ProtoBuffer进行数值表转换以及生成网络通信用的协议
来源:互联网 发布:php比较好的教程 编辑:程序博客网 时间:2024/05/18 12:39
http://blog.csdn.net/kkxsj/article/details/51963968
前言
周末在家中闲着无聊,寻思着业余时间用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
阅读全文
0 0
- 在Unity中使用ProtoBuffer进行数值表转换以及生成网络通信用的协议
- 在Unity中使用ProtoBuffer进行数值表转换以及生成网络通信用的协议
- unity中ProtoBuffer的使用
- Unity中使用Protobuffer探讨
- Android中基于TCP协议的网络通信之使用Socket进行通信
- Android中基于TCP协议的网络通信之使用Socket进行通信
- protobuffer生成协议文件
- 在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信
- 关于android4.0中访问网络不能在主线程中进行以及Handler的使用
- 关于android4.0中访问网络不能在主线程中进行以及Handler的使用
- Unity3D研究之在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信引入中间层
- Unity3D技巧在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信
- C#、Unity网络通信中基于字节码的自定义协议解码,C#版ByteBuffer
- 用CSocket基于UDP协议进行网络通信过程中OnReceive函数无法响应消息的一个原因
- Java 中根据 TCP 协议进行网络通信
- 浅析J2ME终端使用http协议进行网络通信
- 浅析J2ME终端使用http协议进行网络通信
- unity的网络通信
- 函数
- 流程控制语句
- request.setCharacterEncoding(“utf-8”)
- (14)Web开发入门一
- R实战:【基本类型】向量c和矩阵matrix
- 在Unity中使用ProtoBuffer进行数值表转换以及生成网络通信用的协议
- 记录自己日常用到的代码
- caffe image recognization model and prototxt for transfer learning (fine-tuning)
- QTextStream和QDataStream的区别
- Java实现动态切换IP的方法(一)
- swift_041(Swift的@noescape和@escaping)
- 51nod 1046 A^BMod C
- 欢迎使用CSDN-markdown编辑器
- PULL(解析)