简介
基于godot开源客户端引擎和go开源游戏框架pitaya,实现经典多人3D房间fps射击游戏
立足开源才能站在巨人肩膀去跳跃,本文核心在于对各大开源框架的汇总结合与使用经验分享
- godot
和unity差不多,国外用的比较多的免费版游戏引擎
优点:代码开源可修改完全免费,gscript优点如python,短小精炼
缺点:脚本使用自己研发的gdscript,使用第三方库绑定麻烦,一般都得自己翻译实现一遍
https://docs.godotengine.org/zh_CN/latest/index.html - pitaya
go游戏服务器,支持服务器间基于nats和etcd做rpc
官方没有处理并发消息顺序控制,可以看下我的另外一篇文章,多线程游戏服务器实现的处理
https://github.com/yythlj/gogame
https://blog.csdn.net/weixin_44627989/article/details/108692393 - fps-demo
mit开源的godot多人局域网fpsdemo
https://github.com/blockspacer/Godot-3.2-Multiplayer-FPS
服务器结构
- godot战斗服
因为3d游戏的射击等动作,需要用到地图的阻挡、相机穿透等场景算法判断,为了方便和客户端战斗逻辑同步管理,战斗还是使用godot代码独立部署一个战斗服做指令同步与验证,也好做玩家操作的合法验证(相机场景穿透计算等,这些不使用godot引擎额外实现太麻烦)
另外godot提供了便捷的udp帧同步框架,可以作为独立战斗同步服务器 - mongodb数据库
选择mongodb基本是游戏最大方便使用,增删字段不需要改表 - pitaya服务器
gscript在第三方支持的弱势,且主要面向游戏场景的代码风格,不利于业务
因此业务内容还是使用pitaya用go编写,godot服务器与go服务器之间需要通信通道,维持房间信息 - 玩家逻辑
tcp连接go服务器登陆与请求业务,进入战斗后,开辟udp连接godot战斗服进行战斗
godot战斗完成将结果反馈go服务器做业务 - 序列化选择
pitaya支持基于byte与json的序列化,但是因为这里涉及到与godot的通信需要跨语言,且gdscript的数据类型与go不对齐,因此只能基于byte做序列化协议
序列化实现
目前pitaya协议没有gdscript的版本提供,我自己翻译官方go版本的代码,实现了一版gdscript的
https://github.com/yythlj/gdscript-pitaya-protocol(未支持数据压缩,zlib包gdscript没提供)
需要同步调整pitaya此处的握手包数据,不采用json,可参考protocol.gd的解包处理,也不麻烦
protocol.gd实现预览:
demo获取
关注公众号后台留言,可获取相关代码pitaya握手包处理,以及我对Godot-3.2-Multiplayer-FPS的修改版(额外支持了多房间的对战处理,并接入了pitaya服务器tcp通信)
修改版演示:
更多文章,请搜索公众号歪歪梯Club