--- title: Exploring the Gameplay Ability System (GAS) with an Action RPG Unreal Fest 2022学习笔记 date: 2022-11-10 21:04:35 excerpt: tags: GAS rating: ⭐ --- ## 前言 原视频:[Exploring the Gameplay Ability System (GAS) with an Action RPG Unreal Fest 2022](https://www.youtube.com/watch?v=tc542u36JR0&t) ## InitialSetup 首先需要考虑: - 哪些`AttributeSets`需要创建 - 如何让角色获取`GrantAbility` - 如何绑定按键与控制器输出事件 ## CharacterSetup - 继承并实现`IAbilitySystemInterface` - 挂载ASC,但一般还是挂载到PlayerState上。 - 在构造函数中创建默认子物体: - AbilitySystemComponent - AttributeSetObject ### PossessedBy - AbilitySystemComponent->InitAbilityActorInfo(AActor* InOwnerActor, AActor* InAvatarActor) - InitializeAttributes - Listen for tags of interest(via UAsyncATaskGameplayTagAddedRemoved) - Add start-up effects - Bind to Ability activation failed callback ### BeginPlay Listen to Health Attribute change Bind to ASC->OnImmunity ## AttributeSets - PrimaryAttributes——核心RPG状态,绝大多数实体需要 - Health,MaxHealth,Shields,MaxShields,Stamina - Core RPG Style values(比如Strength,Fortitude(坚韧)等) - SecondaryAttributes——一定深度的RPG状态,非所有实体需要 - Elemental resistances(元素抵抗表),Elemental bonuses(元素奖励),Current Elemental build-Ups(当前元素构建方式) - TertiaryAttributes——Bounses(主要用于玩家控制的角色) - Interaction speed bonuses,other specific bonuses and stats - Weapon archetype specific Attribute(武器相关属性) - Charge Percent(充能百分比),Spread(扩散),Charge Count(充能次数) ### 后续改进 - PrimaryAttributes - 将Health等基本属性分割成自己的属性集 - 目前,如果我们给一个UObject等设置了一个属性集来跟踪它们的Health,但它们也会保存其他不必要的值。 - SecondaryAttributes - 对这个设计很满意,因为它都是与元素有关的状态,以及buff/debuff属性。 - TertiaryAttributes - 一些属性可以被分割合并到实体特化的属性集中。 - Weapon archetype specific attributes - 一些int类型的Attribute可以使用Stackable GE来代替(属性集只有float类型),通过查询堆栈数目来获取数据。 ## 演讲者团队增加的额外功能 - UGameplayAbility - Input - UInputAction InputAction(Enhanced Input System) - Custom Ability Input ID Enum - Booleans/Bitfields 开启一些核心功能 ,我们不想对所有Ability增加通过GameplayTags实现的功能 - Activate On Granted - Activate On Input - Can Activate Whilst Interacting - Cannot Activate Whilst Stunned - Cached Owning Character - AsyncAbilityTasks - Attribute Changed - Cooldown Changed - GameplayTag Added Removed - Wait GE Class Added Removed ![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/20221111112940.png) ## 使用DataTable与C++来初始化属性集 ![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/20221111114735.png) 或者就是实现一个结构体基于FAttributeSetIniDiscreteLevel。 ## 创建自定义节点来传递GE计算结果与Tags 多次GE的积累计算结果。主要是通过AbilitySystemGlobals来实现 - GE_Damage - Custom Calculation Class:C++ Damage Execution Calculation - Conditional GEs - GE_BuildUp_Stun - Custom Calculation Class: C++ Build Up Calculation - Conditional GE: GE_Stunned - GE_BuildUp_Burn - Custom Calculation Class: C++ Build Up Calculation - Conditional GE: GE_Burned ![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/20221111140430.png) ![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/20221111140516.png) ## 装备属性变化 ![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/20221111141459.png) ![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/20221111141539.png) ## AbilityTraitsTableExample ![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/20221111141647.png) ## 该团队AbilityEntitySystem设计 用来实现子弹变量、AOE、Cnnstruct、角色等带有ASC的实体。 ![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/20221111142713.png) ![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/20221111142509.png)