UE GAS进阶-深入GE
内容提要
本文深入解读了GE的细节,包括Duration Effect、GE的猜测、Stack Effect的原理和扩展GE功能。文章介绍了GE的生成和激活过程,以及GE对特点、标签、技能和Cue的影响。此外,文章还介绍了如何扩展GE的功能,如根据特点条件增加或移除GE。最后,文章讨论了如何使用自定义通道来支持多个通道。
延伸解读
GE激活与抑制:理解Inhibit机制
文章指出,GE被添加到ActiveEffectContainer后,会通过InternalOnActiveGameplayEffectAdded函数激活。这里的激活与抑制(Inhibit)是控制GE是否生效的开关,不同于Add和Remove。抑制只是暂时关闭GE的作用,并不会移除GE实例。理解这一点有助于区分GE的生命周期状态:添加、激活、抑制、移除。
属性计算:Mod的叠加与Channel机制
GE对Attribute的影响通过Mod实现,包括Add、Multiply、Divide、Override。多个同类型Mod会先累加,再按顺序计算。例如两个Multiply 1.2实际乘数为1.4而非1.44。GAS还支持Mod Channel,可将不同Mod分配到不同通道分别计算,实现乘区隔离。但文章提醒,滥用Channel会增加复杂度,建议优先考虑多属性方案。
GE预测:客户端与服务器的独立行为
GE预测依赖PredictionKey。客户端在本地生成预测GE,服务器独立执行ApplyEffect,两者通过PredictionKey关联。无论服务器判定成功与否,客户端预测GE最终都会被移除。预测仅在PredictionKey有效期内(通常为当前帧)生效,延迟一帧后ApplyEffect将无法预测。这解释了网络延迟下GE表现差异的原因。
扩展GE功能:自定义GameplayEffectComponent
通过派生UGameplayEffectComponent,可以扩展GE的行为。例如实现当生命值大于80%时自动移除狂暴Buff。核心是重写OnActiveGameplayEffectAdded,注册属性变化监听,在条件满足时移除GE。文章还介绍了如何通过CustomChannel支持多通道属性计算,但建议谨慎使用,避免增加维护成本。
Q&A
Duration Effect是如何产生效果的?
Duration Effect通过ApplyEffect生成实例FActiveGameplayEffect,并存储在ASC的ActiveContainer中,激活后才会产生实际作用。
GE的激活和关闭是如何实现的?
GE的激活和关闭通过InternalOnActiveGameplayEffectAdded函数完成,激活GE会产生实际作用,而关闭则不会移除GE。
GE如何影响角色的属性?
GE通过AddActiveGameplayEffectGrantedTagsAndModifiers函数影响角色的Attribute、Tag、Ability和Cue,修正角色的Attribute的Current值。
如何扩展GE的功能?
可以通过GE Component实现扩展功能,例如根据特定条件增加或移除GE,或激活和关闭GE。
GE的堆叠是如何处理的?
GE的堆叠通过ApplyGameplayEffectSpec函数处理,支持overflow和更新堆叠数量,处理完overflow后会更新StackCount。
如何使用自定义通道支持多个通道?
可以在DefaultGame.ini中配置多个Channels,最多支持10个,通过创建GE时选择Channel来实现不同的属性计算。