UE4 服务器同步
Actor 的同步
根据“网络连接概述”中所述,Actor 是实现同步的主要推动者。服务器将保留一份 Actor 列表并定期更新客户端, 以便客户端保留每个 Actor (那些需要被同步的Actor)的近似复本。
Actor 主要通过两种方式进行更新:
-
属性更新
-
RPC (远程过程调用)。
属性更新和 RPC 的主要区别在于,属性可以在发生变化时随时自动更新,而 RPC 只能在被执行时获得调用更新。
其中,最具代表性的一类应当复制的属性就是 Actor 的健康值。每当健康值发生变化时,您通常都希望告知客户端。 如果健康值没有变化,则不会发送任何数据。这样做很有效率。但需要记住的是,即使这个属性没有变化(因此不消耗任何带宽), 它仍然会消耗 CPU 资源来判断这个值是否发生变化。因此,这适合那些经常变化的属性。
RPC 的例子包括:让所有客户端在某个位置看到同一场爆炸。您可以以位置和半径为参数的 RPC 函数,同时在每次发生爆炸时调用它。 您也可以将此存储为一组属性,通过同步的方式将其传达给客户端,但这种做法会损失一些效率,因为爆炸出现的频繁度也许不会高得有必要将它们作为属性。
变量同步(Replication)
同步UObject引用,通过replicated修饰声明
class ENGINE_API AActor : public UObject { UPROPERTY( replicated ) AActor * Owner; };
函数同步(RPC)
在函数声明时使用Server
, Client
, or NetMulticast
关键字修饰UFUNCTION
客户端调用,服务器执行
UFUNCTION( Client ); void ClientRPCFunction();服务器调用,客户端执行
UFUNCTION( Server );void ServerRPCFunction();
服务器调用,在服务器和所有客户端执行
UFUNCTION( NetMulticast ); void MulticastRPCFunction();
组建同步
CharacterMovement = ObjectInitializer.CreateDefaultSubobject<UMovementComp_Character>(this, TEXT("CharMoveComp")); if (CharacterMovement) { CharacterMovement->UpdatedComponent = CapsuleComponent; CharacterMovement->GetNavAgentProperties()->bCanJump = true; CharacterMovement->GetNavAgentProperties()->bCanWalk = true; CharacterMovement->SetJumpAllowed(true); CharacterMovement->SetNetAddressable(); // Make DSO components net addressable CharacterMovement->SetIsReplicated(true); // Enable replication by default }
蓝图中组建同步
BluePrintActor同步
您可以设置是否复制Actor,通过下方的 Replication (复制)部分下的 Defaults (默认)选项卡来完成。
BluePrint变量同步
您可以如下图中这样,通过启用变量的 细节 面板的勾选框来启用对 Health (生命值)的变量 Replication (复制)。
BluePrint事件同步
类似的在事件面板中也有事件同步或者广播的设置