一.RPC概念
远端 过程 调用,RPC这个概念并不是只在UE里有,纯C++ 也有。只不过为了保障可靠性纯C++里用的是TCP。
大部分传统 RPC 框架确实是基于 TCP 的,但不能简单说"传统 RPC = TCP"。
传统RPC
↓
通常使用可靠传输层
↓
TCP(最常见)
例如:
- gRPC → HTTP/2 → TCP
- Apache Thrift → 通常 TCP
- Dubbo → TCP
- brpc → TCP
为什么传统 RPC 喜欢 TCP?
因为业务系统最关心的是:
数据不能丢
数据不能乱序
数据必须完整
互联网公司常说的 RPC(gRPC、Thrift、brpc)本质上大多数都是:
后端:
客户端
↓
RPC
↓
服务A
↓
RPC
↓
服务B
↓
RPC
↓
数据库
整个系统围绕 RPC 运转,RPC本身就是主角。
让程序员感觉像在调用本地函数,但实际上是在调用远程机器上的函数。
而在UE 里,TCP 太慢了,为了实时性通过UDP的一些操作来实现可靠的远程调用。UE DS 便是设计的,区别非常大。
UE 网络架构其实是:
客户端输入
↓
RPC
↓
服务器修改状态
↓
Replication
↓
客户端同步状态
RPC 只是入口。真正负责同步游戏世界状态的是 Replication 系统,而不是 RPC 系统。
总之,RPC 的核心并不是 TCP,而是"可靠的请求-响应模型"。历史上最方便实现这一点的传输层就是 TCP,但技术进步也有其他方式保障可靠。UE为了实时性采用UDP。
二.UE 里的分类
其实很简单,如果看了之前的文章UE 客户端 需要的网络同步概念总结(2)-CSDN博客。大概能猜出来,是 1.客户端呼叫服务器执行 2.服务端呼叫指定客户端执行 3.服务器呼叫所有客户端执行
三.直接上案例
在蓝图里就时 Event 里有这几个对应的选项。

1.测试首先在角色里,CallServerDoSomething里新增事件CallSeverDoSomething
设置这个事件,只在服务器上可靠执行。RunOnSever


按下1测试,确实只在这个事件,才能拿到GameMode。是在服务器上执行的

根据打印日志,确实只在服务器上执行。
2.服务器端 呼叫 客户端 ,在GameMode 里写方法,它只存在与服务器权威端。