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显示/动画, 以及选项回传, 还没有处理后续的逻辑

相关推荐
Jgch224 小时前
出海Facebook广告账户怎么选?
游戏·facebook
长脖鹿Johnny7 小时前
游戏输入系统框架设计(三):网络输入权威与可验证性
网络·游戏·游戏开发·架构设计·输入系统·网络同步
点心的游戏开发世界8 小时前
GDScript 入门笔记(二):变量与数据类型
笔记·游戏引擎·godot
谈资一本本8 小时前
电脑全能修复大师 Gilisoft Total Repair,智能检测修复系统、应用、游戏问题!DLL、DirectX、.NET运行库损坏修复+缺失自动补齐!
游戏·电脑·.net
程序员-Benothing16 小时前
H3 Max开放世界RPG:AI原生游戏,从“能生成“到“能玩“差了多远
游戏·ai-native
CoderYanger1 天前
A.每日一题:1140. 石子游戏 II
java·程序人生·算法·leetcode·游戏·职场和发展·深度优先
无别0521 天前
【做游戏】做完游戏Demo后没地方发布?
游戏·玩游戏
lilian2331 天前
HarmonyOS 7 新特性(二十九)|游戏伴随服务:悬浮协作与质量降级
游戏·语音识别·harmonyos
人民广场吃泡面1 天前
DLSS 5 深度解析:当 AI 学会“创造”画面,实时游戏渲染迎来“GPT 时刻”
人工智能·gpt·游戏
郝学胜-神的一滴1 天前
CMake 047:解锁安装阶段自定义操作,告别配置阶段提前执行坑
运维·服务器·c++·游戏引擎·图形渲染·opengl