网络多人:客户端本地播放与同步

多人游戏里,特效是"表现层"的特权:它不该走服务器复制,而应该由服务器发事件、客户端各自播放。这是特效网络化的核心原则,也是新手最容易做错的地方。

原则:模拟不复制,事件才复制

做法 评价 原因
NS 组件勾选复制,服务器广播粒子状态 ✗ 错 粒子状态量巨大,复制带宽爆炸
服务器播 RPC / 事件,客户端收到后本地播 ✓ 对 一次事件几十字节,表现各自计算
纯本地装饰(自己的脚步尘) ✓ 不用网络 只有自己看得见

客户端预测与遮盖

技能命中时,本地客户端希望"立刻看到特效"(手感),而权威判定可能 100ms 后才返回。标准做法:

  1. 本地客户端先播:预测性的受击特效立即放(乐观播放);
  2. 服务器确认:广播给所有客户端(包括命中位置);
  3. 冲突处理:偏差小 → 不处理;偏差大 → 用一个"修正脉冲"特效遮盖(比如多播一次小爆发),而不是把已播的特效"传送"过去。

不要试图把已播放的粒子"移动"到新位置——粒子模拟是不可逆的,瞬移会产生明显的视觉错误。用新特效遮盖是通用解法。

各端的责任划分

端类型 播什么 例子
监听服务器(主机) 权威视角的所有特效 全场都看得到
远程客户端 自己预测 + 服务器事件触发的特效 其他玩家的技能特效
专用服务器 通常不播(无渲染) 只做逻辑判定与事件广播

一个例外:伤害数字、飘字这类"反馈型"特效严格本地化即可,不需要任何同步——每个客户端看自己的。

网络相关的特效调试

  • 先用网络模拟工具排除丢包与延迟假象;
  • 在客户端确认事件到达时间(打点日志即可);
  • "客户端看到特效的时间距实际发生的时间"称为 VFX Latency(特效延迟),把它作为可观测指标记入性能报告。