同步问题解决的一些思路
移动同步:
Move():执行一次移动
SendMove:发送移动数据包
Check Move or Cheat:位置校验,作弊校验
SendMoveAdjust:下发纠正数据包
Adjust Move():纠正或回滚位置
OnSerializeOthers:同步属性到远程客户端
瞬发技能同步:
关键点:
Local Player 发送射击事件,由 Server 同步给 Remote Player 进行表现
本地检测命中后预表现命中效果,需发送当前时刻的状态数据给 Server
Server 收到后验证命中是否合理
校验通过,应用伤害并同步给所有客户端
命中判定方案:
优先满足射击的人,多数情况下射击是会成功命中的
客户端发送命中上报序号、状态、时间戳、方向、命中位置、玩家信息(弹量等)
Server 在收到数据后进行状态的重现并计算
判定通过,执行命中逻辑并广播给所有客户端
AOE类同步:
关键点:
本地通过前摇推迟子弹发射时间,由 Server 发起子弹创建并通过给所有客户端
所有客户端均存在弹道延迟,通过 Dead Reckoning 算法计算当前位置,再通过插值算法实现帧间平滑效果
命中判定方案:
射击行为监控,Server 创建影子快照,采集 2S 内发射信息(不做物理检测)
记录历史玩家状态,支持按序号或时间回滚,加入超时机制
基于以上信息做位置、方向、发射频率、弹量等策略匹配