网络多人:客户端本地播放与同步
多人游戏里,特效是"表现层"的特权:它不该走服务器复制,而应该由服务器发事件、客户端各自播放。这是特效网络化的核心原则,也是新手最容易做错的地方。
原则:模拟不复制,事件才复制
| 做法 | 评价 | 原因 |
|---|---|---|
| NS 组件勾选复制,服务器广播粒子状态 | ✗ 错 | 粒子状态量巨大,复制带宽爆炸 |
| 服务器播 RPC / 事件,客户端收到后本地播 | ✓ 对 | 一次事件几十字节,表现各自计算 |
| 纯本地装饰(自己的脚步尘) | ✓ 不用网络 | 只有自己看得见 |
客户端预测与遮盖
技能命中时,本地客户端希望"立刻看到特效"(手感),而权威判定可能 100ms 后才返回。标准做法:
- 本地客户端先播:预测性的受击特效立即放(乐观播放);
- 服务器确认:广播给所有客户端(包括命中位置);
- 冲突处理:偏差小 → 不处理;偏差大 → 用一个"修正脉冲"特效遮盖(比如多播一次小爆发),而不是把已播的特效"传送"过去。
不要试图把已播放的粒子"移动"到新位置——粒子模拟是不可逆的,瞬移会产生明显的视觉错误。用新特效遮盖是通用解法。
各端的责任划分
| 端类型 | 播什么 | 例子 |
|---|---|---|
| 监听服务器(主机) | 权威视角的所有特效 | 全场都看得到 |
| 远程客户端 | 自己预测 + 服务器事件触发的特效 | 其他玩家的技能特效 |
| 专用服务器 | 通常不播(无渲染) | 只做逻辑判定与事件广播 |
一个例外:伤害数字、飘字这类"反馈型"特效严格本地化即可,不需要任何同步——每个客户端看自己的。
网络相关的特效调试
- 先用网络模拟工具排除丢包与延迟假象;
- 在客户端确认事件到达时间(打点日志即可);
- "客户端看到特效的时间距实际发生的时间"称为 VFX Latency(特效延迟),把它作为可观测指标记入性能报告。
