【从0到1实现多人FPS房间对战游戏】

从0到1实现FPS房间对战游戏

    • 简介
    • 服务器结构
    • 序列化实现
    • demo获取

简介

基于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

服务器结构

【从0到1实现多人FPS房间对战游戏】_第1张图片

  • 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的解包处理,也不麻烦
【从0到1实现多人FPS房间对战游戏】_第2张图片
protocol.gd实现预览:
【从0到1实现多人FPS房间对战游戏】_第3张图片

demo获取

关注公众号后台留言,可获取相关代码pitaya握手包处理,以及我对Godot-3.2-Multiplayer-FPS的修改版(额外支持了多房间的对战处理,并接入了pitaya服务器tcp通信)
修改版演示:
【从0到1实现多人FPS房间对战游戏】_第4张图片

更多文章,请搜索公众号歪歪梯Club
更多资料,请搜索公众号歪歪梯Club

你可能感兴趣的:(游戏,go,gdscript,multiplayer,fps,godot)