一.定位
变量,大量的周期性的都要调用的。而非函数方法,主动去。相当于不用每帧都由权威端向客户端发起组播。方向都是权威服务器端 到 各个客户端
第三人称模板改。
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_变量

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