Pawns和Characters存在于服务器和所有客户端上,并且可以包含复制的变量和事件。
只有服务器将actor复制到连接的客户端(客户端永远不会将actor复制到服务器)。
Actor的生成/删除:
1.在服务器生成/删除,所有客户端会生成/删除该Actor的副本
2.在客户端生成/删除,服务器和其他客户端不会生成/删除该Actor的副本
对于服务器上存在的每个actor(包括所有复制的actor),服务器都拥有该actor的权限 。
并不是level中所有Actor都对玩家没有显着影响(可见可听)。服务器认为对客户端能够影响客户端的Actors集合被视为该客户端的相关Actors集合。
服务器不会在每次更新时复制actor(减少性能开销)。但以AActor::NetUpdateFrequency属性上指定的频率复制actor 。作为弥补,客户端将在更新之间模拟actor。
Actor的Role为ROLE_Authority,引擎的运行实例负责该actor;
RemoteRole是ROLE_SimulatedProxy(变换频率不高,插值算法)或者ROLE_AutonomousProxy(适用于经常变换的,例如PlayerControllers拥有的actor),引擎实例负责将此actor重新复制到远程连接。
Detailed Actor Replication Flow(Actor复制流程):UNetDriver::ServerReplicateActors负责actor复制
提高复制效率:Performance and Bandwidth Tips
Actor主要以两种方式更新:
1.Property更新(Property Replication):在更改时自动同步(适合经常变化的属性,例如玩家血量)
更新仅来自服务器; 服务器向每个客户端发送更新,客户端永远不会向服务器或其他客户端发送属性更新。
在UPROPERTY( )中进行声明replicated
在构造函数中设置bReplicates = true;
覆写AActor::GetLifetimeReplicatedProps函数
void AFPSCharacter::GetLifetimeReplicatedProps(TArray< FLifetimeProperty > & OutLifetimeProps) const
{
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
DOREPLIFETIME(AFPSCharacter, bIsCarryingObjective);
}
Conditional Property Replication:控制属性如何复制
在GetLifetimeReplicatedProps函数中调用DOREPLIFETIME_CONDITION宏
使用DOREPLIFETIME_ACTIVE_OVERRIDE使用任何自定义条件完全控制属性何时执行和不复制
Replicating object references:复制引用或者指针
2.RPC(远程过程调用):函数在本地调用,但在另一台机器上远程执行
在UFUNCTION( )中进行声明
Server:在(拥有该Actor的)客户端上调用,在服务器上执行
Client:在服务器上调用,在(拥有该Actor的)客户端上执行
Multicast:(多播)在服务器调用,在服务器以及所有客户端上执行;从客户端调用,仅在本地执行
注意Actor必须允许复制
Actor由PlayerController确定所有权
客户端的PlayerController
客户端的PlayerController拥有的Pawn
客户端的PlayerState
发送“Run on server”或者“Run on owning client”事件:
Run on server:在服务器调用此事件,仅在服务器上运行;在(拥有该Actor的)客户端上调用,,则它将被复制到服务器并在服务器上运行。
Run on Owning Client:如果从服务器调用,则此事件将在拥有目标actor的客户端上运行。如果从客户端调用,仅在调用它的客户端上运行。
Reliable
WithValidation:在bool 函数名_Validate( 变量名 )中进行验证