目录
行为同步
On Server:服务端的RPC代码
On Client:客户端的RPC代码
NetMulticast:广播的RPC代码
属性同步
行为同步
借助UFUNCTION进行函数标记
- UFUNCTION(Server):声明一个在客户端调用,在服务端执行的函数
- UFUNCTION(Client):声明一个在服务端调用,在客户端执行的函数
- UFUNCTION(Server):声明一个在服务端调用,在所有终端执行的函数
注:RPC通信函不能有返回值
On Server:服务端的RPC代码
- UFUNCTION中有三个参数:Server,WithValidation ,Reliable
- Server:上一节已经说了
- WithValidation:验证
- Reliable:可靠传输,保证消息传递到Client(TCP)
- RPC函数,有三种:
- 本体:调用
- 本体_Implementation:执行
- 本体_Validate:验证逻辑
- 返回true或false,false表示Client作弊,直接踢掉
On Client:客户端的RPC代码
- 原理与Server所述类似
- Client端不需要Validate(验证)
NetMulticast:广播的RPC代码
- 原理与Server所述类似
- Client端不需要Validate(验证)
属性同步
参数(属性)同步需要将参数注册到复制参数列表,借助UPROPERTY()宏进行标记,并且参数同步操作必须在服务端进行修正,客户端直接修改无法达到目的。
- UPROPERTY(Replicated):标记参数为复制参数
- UPROPERTY(ReplicatedUsing=函数名):标记参数为复制参数,复制操作会回调函数,函数需要使用UFUNCTION标记(向除Server外所有终端进行通知,必须满足相关性)
- 标记完成后需要绑定到复制参数列表
- 所有需要同步的参数都需要绑定到复制参数列表,以便引擎可以方便进行管理
- 绑定需要实现函数GetLifetimeReplicatedProps,并使用宏DOREPLIFETIME进行注册
- C++里需要手动回调,而蓝图里自动回调
属性同步复制条件
- COND_InitialOnly:该属性仅在初始数据组尝试发送
- COND_OwnerOnly:该属性仅发送至actor的所有者
- COND_SkipOwner:该属性将发送至除所有者之外的每个连接
- COND_SimulatedOnly:该属性仅发送至模拟Actor
- COND_AutonomousOnly:该属性仅发送至自主Actor
- COND_SimulatedOrPhysics:该属性将发送至模拟或bRepPhysics actor
- COND_InitialOrOwner:该属性将发送初始数据包,或者发送至actor所有者
- COND_Custom:该属性没有特定条件,但需要通过SetCustomIsActiveOverride 得到开启/关闭能力(如果没有特殊需求少自定义)
属性复制条件可以使得程序员对复制属性的方式和时机进行精细控制
总结:
- 对象Actor必须开启网络复制,其属性才能够完成同步
- 同步中,如果属性变化需要得到通知,尽量不要使用轮询的方式更新,应使用通知方式
- 同步属性应该在Server完成,禁止在Client操作(不会同步 )
- 通常同步数据类型需要使用UE的Gameplay为基础的变量
- 当属性类型为Actor,注意Actor复制引用的相关操作