In this lesson, you will learn how to create a dynamic ability selection system that leverages FGameplayTagContainer queries to filter which abilities a player can trigger based on their current state.
The Logic of Contextual Abilities
Up to this point, you have used tags primarily for blocking or canceling abilities. However, advanced GAS systems often require a "conditional palette," where the available action changes based on environment or character status. Instead of hard-coding if statements inside your GameplayAbility class, you should use the AbilityTagRequirements struct within your ability’s configuration.
By defining AbilityActivateTagRequirements, you instruct the AbilitySystemComponent (ASC) to only allow an ability to fire if the owner possesses (or lacks) specific tags.
Implementation Strategy
Imagine a "Dash" ability that changes based on whether the player is "Grounded" or "Airborne." Instead of checking this inside the ActivateAbility function, you define two separate Gameplay Ability assets:
- Dash_Ground: Set
AbilityActivateTagRequirements.RequireTagsto containState.Grounded. - Dash_Air: Set
AbilityActivateTagRequirements.RequireTagsto containState.Airborne.
When your input component triggers the "Dash" action, you can call TryActivateAbilitiesByTag using a common "Dash" Tag. The ASC will automatically filter out the ability that does not meet the tag requirements and execute the one that does.
// Within your Ability Input binding
void AMyCharacter::OnDashInput()
{
// The ASC will only activate the ability that matches the current tags
AbilitySystemComponent->TryActivateAbilitiesByTag(FGameplayTagContainer(FGameplayTag::RequestGameplayTag(FName("Ability.Dash"))));
}
Why This Matters
By shifting this logic into the ASC’s activation requirements, you decouple your ability execution from your character's internal state machine. This makes your ability system modular: you can add a "Water" state later and simply create a "Dash_Water" ability without ever touching your base character code. This declarative approach keeps your ability logic clean, performant, and easily debuggable through the Gameplay Debugger.
Key Takeaway: Use AbilityActivateTagRequirements to declaratively filter ability execution, allowing the Ability System Component to handle state-based branching rather than manual code checks.