Ue4广域网(3)----Replication和Rep_Notify

一、Replication同步

Replication属性同步一般是指服务器将数据传递到客户端的动作(反之不行),进行同步的方式有两种:
<1>Property Replication属性同步:以对象属性作为基本同步单位的同步机制

<2>Component Replicaotion组件同步:以Actor组件为基本管理单位的同步机制,相对于属性同步属于更粗粒度的管理。

1.Property Replication属性同步

Property Replication 是以Actor的属性单位进行网络同步的机制。每个Actor会维护一个包含所有需要同步的属性列表。当其中有属性发生变化的时候,服务器就会把更新的属性值发送到所有客户端进行同步,客户端收到同步的属性值后,就会更新本地对应的属性为新的值。这种同步机制的方向“只会从服务器Server发送到客户端Client”;“客户端永远不会同步属性到服务器”。如果强行在客户端修改这个属性,那么这个值可能会在下次服务器同步的时候被覆盖,或者永远与其它客户端不同步,导致发生错误。

2.使用Property Replication属性同步

要使用属性同步,首先要保证Actor已经把Replicates标记开启,这个是所有网络机制启用的基本保证。设置方式可以通过蓝图勾选,也可以代码设置。
在这里插入图片描述
然后声明的属性设为Replicated,也可以用C++和蓝图两种方式。
在这里插入图片描述在这里插入图片描述
然后在属性所在的Actor类中,需要声明GetLifetimeReplicatedProps 函数,并调用UE4内置宏添加这个属性同步的调用语句。
在这里插入图片描述
第一个参数是Actor的子类名,第二个是属性名。

3.Replication Condition同步条件

除了默认的同步调用,我们也可以进行条件同步调用,使用的是另一个宏:DOREPLIFETIME_CONDITION
在这里插入图片描述
当使用条件同步时,只有满足了条件所对应的情况才会进行属性同步,这个例子中 COND_OwnerOnly 对应其中一种条件值得枚举值,表示属性只会同步给Actor 的拥有者(Onwer)。还有其它条件枚举值可以选择:
在这里插入图片描述

4.Component Replication组件同步

除了使用同属性同步,UE4也支持以功能组件(Component)的方式进行同步。一般情况下,大部分组件是不需要同步的,需要同步的属性一般都在Actor下通过属性同步方式完成。但有一些特殊Component包含了需要网络同步的属性,这种情况下就需要使用组件同步的功能。

组件同步的方式与Actor的方式基本一致,组件也可以使用属性同步,或者调用RPCs来进行网络交互。组件可以看作是Actor的一部分,当Actor发生同步时,就会递归调用到组件的同步。组件同步属性时,也需要调用相应的 ::GetLifetimeReplicatedProps (…) 函数像Actor一样添加同步属性的设置。

当时用组件同步时,组件可以分为两大类:
<1>静态组件Static Component
静态组件是Actor创建时候就会生成的组件,无论是否进行组件同步,都会创建这个组件。服务器也不会通知客户端创建这类组件,客户端创建Actor的时候就会直接生成,一般这种组件是在C++构造函数Constructor或者作为默认的子物体DefaultSubObject在蓝图里创建。一般只有这类组件的属性发生变化,才需要进行服务器和客户端之间的同步

<2>动态组件Dynamic Component
动态组件是指在运行时动态创建的组件,在服务器创建的动态组件会自动同步到所有客户端实例然后分别进行创建,之后也会在属性变化时候自动同步属性给所有客户端。

客户端虽然也可以创建自己本地的动态组件,但是这种情况下组件并不会同步到服务器,也不会同步给其他客户端,所以在服务器和其他客户端是看不到新创建的组件的。

5.使用组件同步

使用组件同步的方式基本和Actor一样,都是先开启同步的标记属性,然后在GetLifetimeReplicatedProps函数添加具体要同步属性的规则宏。

C++进行组件同步:

要在C++开启组件同步,需要调用组件类的
AActorComponent::SetIsReplicated(true) 方法。如果组件是Actor的默认子对象,那么需要在构造函数生成组件之后进行调用开启同步。
在这里插入图片描述
使用蓝图进行组件同步:
在蓝图中的组件属性面板中,有 Component Replicates组件同步 的属性勾选项,只要勾上就可以开启。
在这里插入图片描述
还有一种方式可以通过在蓝图中 调用函数 的方式开启,蓝图函数是 Set Is Replicated 。
在这里插入图片描述

二、RepNotify

有时候可能想在属性 同步之后 得到通知,或者调用一个回调函数,UE4提供了 RepNotify 机制来实现这个功能。这个机制能让用户提供一个回调函数,在当属性值发生更新之后,就会调用这个回调函数,这个机制对 所有同步的实例 都起作用。

在蓝图里,当选择 Replication类型为RepNotify之后,蓝图会自动创建一个回调函数,一般名称为OnRep_***各式:
在这里插入图片描述
在这里插入图片描述
如果在C++代码中,可以在 UPROPERTY宏 中添加声明, 并手动添加一个同步通知函数,如下:
在这里插入图片描述
这个例子在Health属性同步声明中,指定了OnRep_Health函数作为其RepNotify的函数,要注意这个函数必须添加 UFUNCTION 的宏声明,即使这个宏里是空的声明。

当Health属性更新后,就会调用 OnRep_Health通知函数。在实现中可以添加特殊的逻辑,比如以下的逻辑判断如果Health小于0,则播放死亡动画。
在这里插入图片描述

注:本文摘自:https://blog.csdn.net/williamsgzh/article/details/102094710

猜你喜欢

转载自blog.csdn.net/qq_52269550/article/details/120288090