UE4 网络同步详解(一):理解同步规则
ABSTRACT
CSDN 2017 年长文(Jerish_C),以六个问题串讲 UE4 同步机制的核心规则:Actor 连接所有权与 Role、RPC 的调用-执行矩阵及其与属性同步的先后次序、COND_InitialOnly 条件复制、客户端与服务器的一致性陷阱、属性同步的变化表机制、静态/动态组件的同步规则。是理解 UE4 复制模型的经典入门材料。
核心要点
- 连接所有权:客户端上只有「与玩家控制相关」的 Actor 拥有连接(Role=ROLE_AutonomousProxy),其余为 ROLE_SimulatedProxy;三种归属途径——owner 链顶端是拥有连接的 PlayerController、Pawn Possess 该 Controller、owner 是拥有连接的 Pawn。
- 判断服务器不能看 Role 是否 ROLE_Authority(客户端自建 Actor 也是 Authority),要经 NetDriver/Connection 判断(GetNetMode 的原理);服务器持有 N 个 ClientConnection,客户端只有一个 ServerConnection。
- RPC 执行矩阵三要素:在哪端调用、Actor 归属哪个连接、RPC 类型(Server/Client/Multicast);不合理调用(如客户端替他人调 Server RPC)会被引擎直接丢弃——防作弊设计。
- RPC 生效前提:从 Actor 上调用、Actor 已复制(bReplicate);客户端本地创建的 Actor(RemoteRole=ROLE_None)调 RPC 无效。
- Multicast 不一定到所有客户端:Unreliable 多播会做网络相关性检查(远处未同步该 Actor 的客户端收不到);Reliable 多播必达但官方不建议在有相关性检查的 Actor 上滥用。
- 次序坑:同一函数内「创建 Actor + 发 RPC」,RPC 先于新 Actor 的同步到达客户端——把新 Actor 当 RPC 参数传会拿到 NULL;服务器改属性与 RPC 改同一属性会让 OnRep 回调不触发(ClientRestart 即踩过此坑)。
- COND_InitialOnly:属性只在 Actor 初始 bunch 同步一次(适合姓名、性别等不变量);必须在创建当帧设好值,之后再改不会同步,OnRep 也只跑一次。
- 一致性陷阱:客户端与服务器共用一套代码但 BeginPlay 时机不同;客户端 SpawnActor 时若 bReplicates=true 会失败(TemplateAllowActorSpawn);未勾复制的纯表现对象在客户端可能因「靠近-离开-再靠近」反复创建(如粒子发射器泄漏)。
- 属性同步机制:服务器为每个同步 Actor 维护属性变化表(FObjectReplicator/FRepLayout 等),值变化才推送;OnRep 回调以「客户端新值 ≠ 旧值」为准;休眠 Actor 不同步;TArray 长度变化可正常同步。
- 结构体同步:UStruct 整体标记 Replicated 后成员默认全同步(含递归子结构体);成员可用 NotReplicated 排除(仅对 UStruct 有效);结构体成员不能单独标 Replicated;UStruct 数组内部属性必须标 UPROPERTY 否则同步崩溃。
- 组件同步:静态组件(构造函数/蓝图添加)随 Actor 一起序列化,与自身 Replicate 标记无关;动态增删的组件必须 SetIsReplicated(true),之后属性同步与 RPC 行为与 Actor 几乎一致(ReplicateSubobjects 遍历)。
- 实用 Tips:Server RPC 需标 reliable/unreliable 与 WithValidation;GetLifetimeReplicatedProps 别忘
#include "Net/UnrealNetwork.h";编译错误看输出窗口别看 VS 错误列表;重写 Actor 函数务必调 Super(Tick 注册在 BeginPlay)。
关键实体与概念
连接所有权、ROLE_Authority/AutonomousProxy/SimulatedProxy、RemoteRole、NetDriver、RPC、Multicast、DOREPLIFETIME、COND_InitialOnly、OnRep、FRepLayout、bReplicates、SetIsReplicated、UStruct/NotReplicated
关联概念
来源回溯
- 原始文件:
raw/gamedev/ue4网络同步详解-一-理解同步规则_jerish_c的博客-csdn博客_ue4-属性同步.md(evernote/FW-游戏3研发技术 导入)
时效性评估
- 仍有效:连接所有权、RPC 矩阵、变化表、条件复制、组件同步规则是 UE 复制模型的地基,UE5 沿用(并新增 Iris 复制系统做底层重构,语义兼容)。
- 已过时:WithValidation 在新版引擎中已被废弃(改由服务端逻辑自校验);4.x 的具体 API 细节以现版本文档为准。