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 的六个典型误用

  1. 在客户端调 Multicast:本地触发了,别的端没收到。必须走「客户端 Server RPC → 服务器调 Multicast」两跳。
  2. 在服务器调 Server RPC:本地立即执行一次——没问题但很反直觉。若这段逻辑客户端也能调到,注意 ListenServer 主机会执行两次(客户端上下文调一次 + 服务器本地执行一次),造成双倍行为。用 Switch Has Authority 保护。
  3. 把每帧的逻辑挂 Reliable RPC:队列积压(见 3.2)。
  4. RPC 参数传 Actor 引用不判空:跨端引用解析失败时是 nullptr,调用其函数 → 蓝图静默失败。养成在事件入口判 IsValid 的习惯。
  5. 忘了 WithValidation:蓝图 Server RPC 默认没有 Validate,等于对外完全不设防。蓝图业务快速原型期可以先没有,但联机测试前必须补。
  6. 在「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 一抓一个准。