60 lines
2.3 KiB
Markdown
60 lines
2.3 KiB
Markdown
---
|
||
title: "RPC (Remote Procedure Call)"
|
||
type: concept
|
||
tags: []
|
||
sources: [unreal-multiplayer-architect]
|
||
last_updated: 2026-04-26
|
||
---
|
||
|
||
## Definition
|
||
远程过程调用(RPC)是 UE5 多人游戏中客户端与服务器之间进行通信的核心机制。客户端通过 RPC 向服务器发送请求(Server RPC),服务器通过 RPC 向客户端或所有客户端广播事件(Client RPC / NetMulticast)。
|
||
|
||
## RPC Types
|
||
| 类型 | 方向 | 可靠性 | 用途 |
|
||
|------|------|--------|------|
|
||
| `Server` | 客户端 → 服务器 | Reliable/Unreliable | 客户端请求服务器执行操作 |
|
||
| `Client` | 服务器 → 特定客户端 | Reliable/Unreliable | 服务器通知特定客户端 |
|
||
| `NetMulticast` | 服务器 → 所有客户端 | Reliable/Unreliable | 服务器广播事件 |
|
||
|
||
## Critical Rule: WithValidation
|
||
**每个游戏影响型的 Server RPC 必须实现 `_Validate()` 函数。** 缺失 `_Validate()` 构成安全漏洞,恶意客户端可发送非法请求。
|
||
|
||
```cpp
|
||
// Server RPC 必须有 WithValidation
|
||
UFUNCTION(Server, Reliable, WithValidation)
|
||
void ServerRequestInteract(AActor* Target);
|
||
|
||
bool AMyActor::ServerRequestInteract_Validate(AActor* Target)
|
||
{
|
||
// 拒绝不可能的请求
|
||
if (!IsValid(Target)) return false;
|
||
float Distance = FVector::Dist(GetActorLocation(), Target->GetActorLocation());
|
||
return Distance < 200.f; // 最大交互距离
|
||
}
|
||
|
||
void AMyActor::ServerRequestInteract_Implementation(AActor* Target)
|
||
{
|
||
// 验证通过后安全执行
|
||
PerformInteraction(Target);
|
||
}
|
||
```
|
||
|
||
## Reliability Guidelines
|
||
- **Reliable**:保证按序到达,用于游戏关键事件(伤害、得分、道具拾取)
|
||
- **Unreliable**:即发即忘,不保证到达,用于视觉效果、高频位置同步
|
||
- 绝不能将高频调用与可靠 RPC 混合——必须为高频数据创建独立的不可靠更新路径
|
||
|
||
## Connection to Other Concepts
|
||
- [[Server-Authoritative Model]] — RPC 是服务器权威执行的游戏请求入口
|
||
- [[Actor Replication]] — 属性复制与 RPC 互补,复制状态、RPC 触发动作
|
||
- [[Network Prediction]] — 客户端在等待服务器 RPC 响应时进行本地预测
|
||
|
||
## Relationship to Agent
|
||
[[UnrealMultiplayerArchitect]] 将 RPC 验证视为非妥协原则:"Every Server RPC needs a `_Validate`. No exceptions."
|
||
|
||
## Aliases
|
||
- Remote Procedure Call
|
||
- Server RPC
|
||
- Client RPC
|
||
- NetMulticast
|