UE 属性同步

一.定位

变量,大量的周期性的都要调用的。而非函数方法,主动去。相当于不用每帧都由权威端向客户端发起组播。方向都是权威服务器端 到 各个客户端

第三人称模板改。

ThirdPersonCharacter里,先加一个变量,血量。

然后每帧监听,这个变量是不是主机代理,并且打印血量。只打印本机的血量,不打印其他玩家的生命值。

二.制作陷阱,权威端服务器扣血

1.加一个Cube,再加个正方形碰撞

2.碰撞扣血的逻辑

用 DS 判断,这样单机也不行了,这能DS下。

三.验证

没有属性同步时,单机状况下,ListenSever。可以扣血,单机服务器和客户端属于一个了嘛。

ListenSever可以看到服务器扣血。

但是多人玩家客户端

服务器上是扣了的,但是客户端看不到。所以需要属性同步

四.设置属性同步 Replicated

将角色的血量属性,设置为同步。将这个值从权威服务端,同步到客户端。

五.再验证

1.碰撞后扣血

2.服务端客户端,全部打印

符合预期

六.同步规则

COND_* 的设计目的,是控制一个网络同步属性:在什么条件下、同步给哪些连接。

服务器准备复制某个属性时,大致会判断:

纯文本

启用自动换行

复制

属性值发生变化

该客户端满足 COND_* 条件

↓

把属性发送给这个客户端

cpp 复制代码
// 普通同步属性
UPROPERTY(Replicated)
int32 Ammo;

// 带同步回调的属性
UPROPERTY(ReplicatedUsing = OnRep_Health)
float Health;

void AMyActor::GetLifetimeReplicatedProps(
    TArray<FLifetimeProperty>& OutLifetimeProps) const
{
    Super::GetLifetimeReplicatedProps(OutLifetimeProps);

    DOREPLIFETIME_CONDITION(AMyActor, Ammo, COND_OwnerOnly);
    DOREPLIFETIME_CONDITION(AMyActor, Health, COND_OwnerOnly);
}
cpp 复制代码
DOREPLIFETIME_CONDITION(
    AMyCharacter,
    Ammo,
    COND_OwnerOnly
);
这表示 Ammo 只发送给该 Actor 的拥有者。自己的子弹数能收到,其他玩家不会收到。

七.RepNotify 属性同步,回调方法

选择这个后

会自动生成回调函数 OnRep_变量

验证成功,每次扣血都会,提示收到生命值修改的同步 日志

相关推荐
奇树谦1 小时前
本地FastDDS+远端MQTT转发(多主机数据隔离)架构设计与落地
运维·网络
HackTwoHub1 小时前
REA逆向一切!渗透逆向新利器、MCP 驱动全栈逆向方案,解析原生二进制、EXE、APK,高效挖掘程序底层漏洞
网络·安全·web安全·网络安全·系统安全
无忧.芙桃1 小时前
图的精髓:邻接矩阵与遍历全解析
c++·算法·面试·深度优先·广度优先
jimy11 小时前
标准的动态类型定义与“多态”无关,非多态对象同样会出现动态类型不同于静态类型的情形
开发语言·c++
MOONICK1 小时前
COM 组件技术(三)
c++·windows
_wxd6661 小时前
二叉搜索树(BST)万字详解:概念、操作、性能分析与 C++ 实现
数据结构·c++·二叉搜索树
pt10432 小时前
Cisco设备网络安全系列-3:远程访问虚拟专用网、站点间虚拟专用网与Cisco SD-WAN安全
网络·安全
UIU1142 小时前
P1115 最大子段和
c++·算法
wuminyu2 小时前
ZGC染色指针在虚拟线程stackChunkOop上的并发屏障全景分析
java·linux·c语言·jvm·c++