You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// UAbilitySystemComponent::ApplyGameplayEffectSpecToSelf() 函数// Clients should treat predicted instant effects as if they have infinite duration. The effects will be cleaned up later.bool bTreatAsInfiniteDuration = GetOwnerRole() != ROLE_Authority && PredictionKey.IsLocalClientKey() && Spec.Def->DurationPolicy == EGameplayEffectDurationType::Instant;
非issue,共同讨论一下文档中的提出的问题。
最近学习GAS,也遇到了一样的问题,根本原因是在遇到多个对于同一Attribute的Multiply/Divide Modifier时,GAS对于Instant GE,和Duration | Infinite GE 的处理不一样。
比方说,连续两个针对同一个属性的Multiply Modifier,系数都是1.5,那么:
1.5 * 1.5 = 2.25
1 + (1.5 - 1) + (1.5 - 1) = 2
原因是:
对于Instant GE,会使用
UAbilitySystemComponent::ExecuteGameplayEffect
函数来计算,会通过遍历Modifier来迭代计算其对于属性的影响。而对于Duration | Infinite GE,则会通过
UAbilitySystemComponent::OnAttributeAggregatorDirty
函数来响应其对属性的影响,而这个函数会调用到EvaluateWithBase()
函数,通过SumMods
预计算所有Multiply Modifier
的系数和,来计算。而还有一个藏得更深的坑,对于Instant GE,客户端会有预测逻辑,会将其看作是Infinite GE看待。
也就会造成,在单个或者多个
Instant GE
针对某个Attribute
拥有多个Multiply / Divide Modifier
的情况下,客户端预测计算出来的值和实际服务器计算的值不一样!!这个错误的值可能会在一段时间后(如果当前网络状态较差,或者弱网络丢包,情况更严重),通过服务器的属性同步,修正为正确的值。The text was updated successfully, but these errors were encountered: