Godot游戏练习01-第26节-轮次结束后弹出升级选项

本节实现游戏轮次结束之后弹出可选的升级选项, 供玩家选择, 每个玩家出现的升级选项可以不一样

这一节我卡了好久, 因为实现过程中碰到很多麻烦的问题

原教程的逻辑如下:

  1. 服务端判断轮次结束, 不要直接开始下一轮次, 而是进入升级选项生成流程
  2. 服务端为遍历所有peer, 为每个peer生成一个升级选项列表, 并缓存对应peer的可用升级选项列表
  3. 服务端使用rpc_id, 将对应peer的升级选项发送到peer, 由每个peer仅在自己的客户端上生成对应的升级选项Node

希望达成的效果是, 服务器决定每个peer的升级选项, 每个peer展示自己的升级选项Node, 每个peer可以通过射击来选中其中一个升级选项并通知到服务器, 不同peer之间互不影响, 一个peer打碎(选中)升级选项Node, 不影响另一个peer上的升级选项

但是有个尴尬的问题, 目前的HitBox和HurtBox都是在服务端进行实际的碰撞检测与逻辑处理, 子弹/升级选项等Node的authority都是Host, 碰撞检测与逻辑处理实际上只发生在Host端, Client的peer射击子弹只会与Host上的升级选项发生碰撞, 而Client端生成的升级选项仅Client自身知道和可见, 而且压根不会进行物理碰撞判断

原教程中的处理方式如下:

  1. 在Host端生成所有peer端的升级选项, 每个升级选项的HurtBox设置peer_id_filter, Host端隐藏其余peer的升级选项节点显示
  2. Host端生成子弹时, 在子弹的HitBox中设置source_peer_id为发射子弹的玩家对应peer_id
  3. Host端检测碰撞(HurtBox)中, 先判断是否设置了peer_id_filter(大于0), 若设置了, 则碰撞时进行过滤, 仅与对应source_peer_id的HitBox碰撞
  4. 对应的peer的客户端上仅同步生成自己的peer_id对应的升级选项节点, 不执行实际的碰撞检测
  5. 经过以上处理之后, 对应peer的子弹仅会与Host上对应peer的升级选项发生碰撞, 各peer上仅显示自身能选择的升级选项, Host上有所有peer的升级选项但仅显示自身peer能攻击的选项(peer_id_filter为1)
  6. 当某peer通过子弹攻击升级选项节点, 选择自己的升级项之后, Host端删除所有该peer的升级选项节点并通知对应peer也删除所有升级选项节点

我觉得这个处理流程太麻烦了, 直接在场景中生成节点, 让玩家通过"攻击"的方式选择升级选项有比较好的沉浸感, 但是按照这种处理方式服务端与客户端显示的内容不同, 流程过于复杂, 不直接用UI处理, 也符合很多主流游戏的做法

前面的过程一样, 通过Host生成所有peer端的升级选项, 并缓存, 之后对每个peer执行rpc调用, 在对应peer客户端显示升级选项UI, 玩家选中升级选项之后, 通过rpc将index响应到服务器

目前只是按自己的想法实现了UI显示/动画, 以及选项回传, 还没有处理后续的逻辑

相关推荐
南無忘码至尊2 小时前
Unity学习90天-第1天-认识Transform + 坐标系
学习·unity·游戏引擎
南無忘码至尊3 小时前
Unity学习90天-第1天-认识Unity并书写我们的第一个脚本
学习·unity·游戏引擎
私人珍藏库3 小时前
【Android】GameNative 0.9.0 [特殊字符] 手机畅玩Steam游戏
android·游戏·智能手机·app·工具·软件·多功能
wanhengidc3 小时前
云手机搬砖安全吗
大数据·运维·服务器·安全·游戏·智能手机
wanhengidc3 小时前
服务器管理器的作用有哪些?
运维·服务器·网络·安全·游戏·智能手机
雪域迷影4 小时前
Hazel游戏引擎结构分析
c++·游戏引擎·hazel
前端不太难6 小时前
一天做出:鸿蒙 + AI 游戏 Demo
人工智能·游戏·harmonyos
weixin_4093831212 小时前
godot创建两种敌人僵尸 一种吐舌头 一种在角色脚下生成圆形伤害圈 两种僵尸均继承enemy脚本 理解继承
游戏引擎·godot
mxwin19 小时前
Unity Shader 跨平台兼容性:处理纹理坐标翻转与精度差异
unity·游戏引擎