Net Role
AActor.Role描述了角色的网络属性,从而决定了rpc和replicated时的行为表现。这3个网络Role属性分别是:ROLE_Authority,ROLE_AutonomousProxy,ROLE_SimulatedProxy
ROLE_Authority,在服务器上的所有角色都是Authority属性
ROLE_AutonomousProxy,客户端上的本地角色
ROLE_SimulatedProxy,客户端上的网络角色
so
服务器上的所有角色都是Authority属性,当前控制的角色可以用IsLocalControlled区分
客户上当前控制的角色具有Autonomous属性
客户端上的远程角色具有SimulatedProxy属性
Actor 的 Role 和 RemoteRole 属性
Net Mode
ENetMode AActor.GetNetMode()
NM_Standalone,
/** Standalone: a game without networking, with one or more local players. Still considered a server because it has all server functionality. */
NM_DedicatedServer,
/** Dedicated server: server with no local players. */
NM_ListenServer,
/** Listen server: a server that also has a local player who is hosting the game, available to other players on the network. */
NM_Client,
/**
* Network client: client connected to a remote server.
* Note that every mode less than this value is a kind of server, so checking NetMode < NM_Client is always some variety of server.
*/
Replicated Data
Actor中的Replicated数据自动复制到所有客户端上
客户端数据不能复制到服务器,只会在客户端本地生效
so
如果数据定义为replicated,最好仅在server上进心更新,在client上只读,避免引起不必要的混淆。
这样判断端的属性:
在C++中判断是否为服务器:Role == ROLE_Authority
在BP中判断是否为服务器:HasAuthority
Replicated的数据在bp中set/get的时候会头顶多顶2个小球
Replicated Data in C++
#include "Net/UnrealNetwork.h"
UPROPERTY(BlueprintReadOnly,Replicated)
float Health;
------
voidATestNetworkCharacter::GetLifetimeReplicatedProps(TArray< FLifetimeProperty> & OutLifetimeProps) const
{
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
DOREPLIFETIME(ATestNetworkCharacter, Health);
}
如果不包含头文件UnrealNetwork.h会报错:
error C3861: 'DOREPLIFETIME': identifier not found
RPC
函数有3种replication方式
Multicast---在服务器调用,然后自动转到客户端
Server---被客户端调用,仅在服务器执行;必须在有Net Owner的Actor上使用
Client---被服务器调用,仅在其所有者客户端执行;必须在有Net Owner的Actor上使用
Net Owner
Actor如果是Player controller或被Player Controller所拥有,则此actor有Net Onwer
也就是说除了多播,rpc函数如果想调用成功必须有以下限制条件
Actor是一个Player Controller类型;
Actor被一个Player Controller所拥有;
您必须满足一些要求才能充分发挥 RPC 的作用:
https://docs.unrealengine.com/latest/CHN/Gameplay/Networking/Actors/RPCs/index.html
它们必须从 Actor 上调用。
Actor 必须被复制。
如果 RPC 是从服务器调用并在客户端上执行,则只有实际拥有这个 Actor 的客户端才会执行函数。
如果 RPC 是从客户端调用并在服务器上执行,客户端就必须拥有调用 RPC 的 Actor。
xxx
xxx
xxx
xxx
xxx
xxx
xxx
xxx
xxx