UE GAS笔记
核心概念
状态表示:
状态由两部组成:Attribute、GameplayTag。
- Attribute代表数值类状态,例如移动速度、攻击力。代码定义如图所示:
BaseValue代表永久改变的部分,CurrentValue代表当前最新的值,是由基础值加上buff改变值。瞬时或周期性的GE会直接修改BaseValue,持续性GE则是在BaseValue的基础上给出影响值计算出CurrentValue。属性修改具体实现:通过Aggregator计算所有Modifier的修改,然后进行最大最小值的限制再设置给CurrentValue。一个FGameplayAttribute 对应一个 FAggregator。具体可以细看UAbilitySystemComponent.ActiveGameplayEffects.AttributeAggregatorMap相关代码。 - GameplayTag相较于传统用枚举值来表达状态有一个好处:Tag具备分门别类,可以使用父Tag代表一组Tag。
GameplayEffect:
可以理解成Buff,修改状态。简写GE。GE里可以通过配置Modifiers来修改Attribute,配置GrantedTags则可以在GE的所有者身上添加Tag。另外GE还可以配置:GE堆叠规则、赋予技能等。
GameplayAbility:
技能,可以添加GE、播放蒙太奇、发送事件、等待事件触发。可以通过Tag实现技能间的打断、互斥、免疫等。以及输入的绑定。
重要函数介绍:
- CanActivateAbility() - 判定技能是否可以激活。
- TryActivateAbility() - 尝试激活技能。会先调用CanActivateAbility()进行判断。会处理网络同步以及技能预测相关逻辑。
- ActivateAbility() - 技能逻辑写在这里,子类需要override此函数。
- CommitAbility() - 应用技能消耗(技能冷却、法力消耗…)。别忘记在ActivateAbility()里调用此函数。
- CancelAbility() - 从外部中断技能
- EndAbility() - 技能结束自身,表示技能执行完毕。
UAbilitySystemComponent
角色身上的技能大管家。主要功能涉及到:属性集的管理、当前角色拥有的技能、激活中的技能、挂载了哪些GE、GameplayTag的管理。
放上大钊总结的图: