我们项目使用派生自UAbilitySystemComponent的子类UExtendAbilitySystemComponent。在子类中,有一个FastArray类型的需要复制的成员变量ExtendActivatableAbilities,我们希望它在UAbilitySystemComponent::ActivatableAbilities之前被复制到客户端。为了达到这个目的,UExtendAbilitySystemComponent::GetLifetimeReplicatedProps被实现为:
void UExtendAbilitySystemComponent::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
FDoRepLifetimeParams SharedParams;
SharedParams.bIsPushBased = true;
SharedParams.Condition = COND_OwnerOnly;
DOREPLIFETIME_WITH_PARAMS_FAST(UExtendAbilitySystemComponent, ExtendActivatableAbilities, SharedParams);
Super::GetLifetimeReplicatedProps(OutLifetimeProps); // 放在最后
}
如此一来,ExtendActivatableAbilities就会先于ActivatableAbilities到达客户端。
根据控制台变量bReplicateCustomDeltaPropertiesInRepIndexOrder的描述,这应该是引擎有意提供的机制。
在我们把引擎升级到5.6.1后,该机制失效了。
查看源码得知,之前FRepLayout::InitFromClass函数会按照LifetimeProps的顺序构造LifetimeCustomPropertyState;而在新版本,改成了按照ClassReps的顺序进行构造。看上去,用户不能再通过填充LifetimeProps的顺序对复制顺序产生影响了。
那么,在5.6.1版本,用户应该如何控制属性的复制顺序呢 ?