Skip to content

射击游戏权威与瞄准同步 ​

读取射击同步最佳实践,按当前游戏选择顶视角、TPS 或 FPS 的瞄准规则。项目内若该相对链接不可用,在 docs/sdk/best-practices/ShooterAuthorityAndAimSync.md 查阅。API 签名与可用端以当前 api/client / api/server 为准。

先确定输入与状态 ​

  • 客户端向服务端发送移动、瞄准和开火意图;服务端校验并决定位置、子弹、命中、伤害和弹药。属性组件与 Node SyncVar 的服务端写入不是输入上行接口。
  • 本机瞄准立即响应鼠标/摇杆;远端角色使用服务端确认后的姿态。将本机预测表现与 replicated 状态分开,避免每帧覆写同一节点与网络平滑冲突。
  • 保留既有 Unit/Ability 或直接 GameGraph 路线。选型未确定时读 wasicore-game-architecture;已有项目不要仅因出现血量、角色或联机需求就换架构。

配方关键约束 ​

  • 输入协议定义生命/回合代次、序号、按钮状态和 aim。服务端使用消息的真实发送者,不信任 payload 中的控制者或命中结果。按钮变化独立于瞄准角差限流。
  • 单次开火关联本枪 aim 和 shot 序号;连射可由服务端按有效的 fire-held 状态产生。定义去重、释放、失效和确认规则,客户端合并预测表现,避免重复发射/播放。
  • 下行可用少量 replicated Node 表达位置、下身方向和独立 AimPose;模型、骨骼步态和后坐力 local。Node.CreateChild(...) 默认 local,需要同步的控制节点显式指定复制模式。
  • 属性组件用于玩法状态和按属性分级的可见性。语义 aim 也可放属性/SyncVar,但没有自动旋转插值;不要同时让属性 aim 与 Node.Rotation 竞争控制同一个姿态。
  • 将完整精度权威 aim 与限流发布的观看姿态分开。角差比较相对上次实际发送值,并处理角度回绕/q 与 -q 等价;限流不能改变服务端命中精度。
  • 当前 TransformSnapThreshold 是位置距离,TransformSmoothingConstant 是图级视觉收敛速度;它们不设置角差或网络频率。不要编造已存在的旋转容忍度、输入预测、历史插值或延迟补偿 API。
  • Node、属性和确认消息不保证原子到达。预测回放需要权威姿态、server tick 和 ack 序号对应同一步,不能用平滑显示位置代替确认快照。
  • TPS 从准星意图得到目标,再由权威枪口确定发射方向并检查遮挡;相机能看见目标不表示武器可以穿墙。FPS 同样明确视点/枪口规则,远距离误差与历史命中策略单独验收。

实施与验证边界 ​

现有节点复制已使用引擎旋转平滑,但它只追随最新目标。服务端发布图与 local 物理的细节见 server-authoritative-3d-physics;属性组件选型见 multiplayer-hybrid-sync。额外公开 Urho 网络类型不自动解决星火传输、预测和回溯需求。

先完成所需权威玩法,再根据重复实现收口 API。顶视角合作样例已完成普通单人、双人和四人调试;其角差/频率值是该样例的起点,其他射击游戏仍按射程、延迟和手感测量。真实双人测试要贯通服务端和两个客户端,覆盖独立瞄准、微小转角累计、停火、输入失效、重生、后加入与掩体;日常表现迭代可使用单客户端。