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_变量

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

相关推荐
广东融科数据服务有限公司16 小时前
网络监控经常卡顿、掉线、画面模糊?一线排查问答实录
开发语言·网络·php
Bczheng116 小时前
VS2022 安装MFC和QT
c++·qt·mfc
贝猫说python16 小时前
为什么要拆分成 mac 地址和 ip 地址,放一起为什么不行
网络·智能路由器
海绵宝宝转agent16 小时前
计网基础知识
网络·笔记·学习·智能路由器
dialect_17 小时前
CODEFORCES ROUND 1127 DIV2
开发语言·c++·算法
R²AIN SUITE17 小时前
多云或私有云环境怎么选项目管理工具?RainSuite等5种产品的8项部署验证
服务器·网络·数据库
悠仁さん1 天前
【C++】AVL 树
c++
wuminyu1 天前
JVM规范学习总结:解释器与JIT编译器如何处理JVM字节码
java·linux·c语言·jvm·c++
小徐不徐说1 天前
序列化与反序列化:把 C++ 对象可靠地保存下来
开发语言·数据库·c++·php
ragnwang1 天前
Notes: Python pybind11 import C++ module
开发语言·c++·python