3.4 蓝图里的 RPC:节点、开关与常见误用
三类节点
蓝图事件图表里,自定义事件(Custom Event)面板有三个开关(Replicates / Run on Server / Run on owning client / Run on all clients):
| 设置 | 等价 C++ | 说明 |
|---|---|---|
| Not Replicated | 普通函数 | 纯本地 |
| Run on Server | Server RPC | 需勾 Reliable/Unreliable |
| Run on owning Client | Client RPC | |
| Multicast | NetMulticast | 只能从服务器调用 |
开关「Replicates」下面还有 Reliable 复选框和 WithValidation(蓝图事件面板可加 _Validate 实现)。
蓝图 RPC 的六个典型误用
- 在客户端调 Multicast:本地触发了,别的端没收到。必须走「客户端 Server RPC → 服务器调 Multicast」两跳。
- 在服务器调 Server RPC:本地立即执行一次——没问题但很反直觉。若这段逻辑客户端也能调到,注意 ListenServer 主机会执行两次(客户端上下文调一次 + 服务器本地执行一次),造成双倍行为。用
Switch Has Authority保护。 - 把每帧的逻辑挂 Reliable RPC:队列积压(见 3.2)。
- RPC 参数传 Actor 引用不判空:跨端引用解析失败时是 nullptr,调用其函数 → 蓝图静默失败。养成在事件入口判 IsValid 的习惯。
- 忘了 WithValidation:蓝图 Server RPC 默认没有 Validate,等于对外完全不设防。蓝图业务快速原型期可以先没有,但联机测试前必须补。
- 在「Run on Server」事件里读本地预测状态:事件到达服务器时要过一个网络 tick,此刻客户端的输入序列号/预测状态已变化。需要时把「客户端当时的输入序列号」作为参数一起发过去。
蓝图 RPC 的编译期保护
蓝图编译时,网络相关错误(如 Multicast 在客户端图表路径上调用)会报编译错,但「ListenServer 双执行」这类运行时问题不会报——只能靠 Switch Has Authority 自己防。
一页速查图(文字版)
客户端想做某事 → Switch Has Authority
├─ Authority(服务器)→ 直接执行
└─ 远程 → Run on Server 事件 → 服务器端函数体执行
服务器要给某个玩家推事件 → Run on owning Client 事件
服务器要给全场推事件 → Multicast 事件(注意相关性收束)
玩家间共享的持续状态 → 属性复制 + OnRep(优于高频 RPC)
性能小贴士
- 蓝图 RPC 的序列化比 C++ 慢一点(参数要走蓝图序列化),高频场景考虑迁 C++。
- 蓝图自定义事件的「可靠」开关默认关闭——打开前想清楚是否真的需要保证到达。
心得:蓝图做联网原型的速度极快,但「跑通」和「正确」之间隔着 ListenServer 这一关。我的标准验证流程是:每次写完联网蓝图,先 Number of Players=2(ListenServer)跑一遍,再开独立进程客户端(非单进程)跑一遍——两种模式行为不同的 bug 一抓一个准。
