引言
UE4中属性被注册进行复制后,将再也无法再取消注册。那么,如何对属性复制过程进行更细化的控制呢?
DOREPLIFETIME_CONDITION
可以通过传入条件枚举来设置对应的属性复制功能。
使用示例:
void UTest::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
DOREPLIFETIME_CONDITION(UTest, m_arrayItem, COND_InitialOnly);
}
条件枚举说明:
条件 |
说明 |
COND_InitialOnly |
该属性仅在初始数据组尝试发送 |
COND_OwnerOnly |
该属性仅发送至 actor 的所有者 |
COND_SkipOwner |
该属性将发送至除所有者之外的每个连接 |
COND_SimulatedOnly |
该属性仅发送至模拟 actor |
COND_AutonomousOnly |
该属性仅发送给自治 actor |
COND_SimulatedOrPhysics |
该属性将发送至模拟或 bRepPhysics actor |
COND_InitialOrOwner |
该属性将发送初始数据包,或者发送至 actor 所有者 |
COND_Custom |
该属性没有特定条件,但需要通过 SetCustomIsActiveOverride 得到开启/关闭能力 |
到目前为止,我们已经讨论了基于已知状态的条件。这可以让引擎方便的做出必要的优化,同时让您对属性复制拥有足够的控制。
DOREPLIFETIME_ACTIVE_OVERRIDE
可以让您进行全面控制,利用您想要的任何定制条件来决定何时复制/不复制某个属性。需要注意的是,这种控制需针对每个 actor(而不是每条连接)逐一进行。换句话说,如果在定制条件中使用一个可根据连接而发生变化的状态,会存在一定的安全风险。具体示例如下。
void AActor::PreReplication( IRepChangedPropertyTracker & ChangedPropertyTracker )
{
DOREPLIFETIME_ACTIVE_OVERRIDE( AActor, ReplicatedMovement, bReplicateMovement );
}
现在 ReplicatedMovement 属性只会在 bReplicateMovement 为 true 时复制。
为何不一直使用这个宏?主要有两个原因:
-
如果定制条件的值变化太大,这种做法会降低执行速度。
-
您不能使用根据连接而变化的条件(此时不检查 RemoteRole)。