Quick answer: Check cost (does the owner have the resource?), cooldown (is the cooldown effect active?), blocked/required tags (matching the avatar’s current tag set?), and authority (are you calling from server or client?). Use showdebug abilitysystem to see what is actually blocking activation.

Here is how to fix Unreal GameplayAbility not activating. You spent an afternoon setting up the Gameplay Ability System: AbilitySystemComponent on your character, an ability class for your fireball, a cost effect for mana, a cooldown effect for timer. You press the fire button. K2_ActivateAbility never runs. No error, no log, nothing. The ability is granted (you can see it in the spec list), but activation silently fails. GAS has many gates an activation must pass through, and by design it says nothing when it refuses.

The Symptom

Pressing an input bound to a gameplay ability causes nothing to happen. TryActivateAbility or TryActivateAbilityByClass returns false, or the Blueprint call appears to succeed but ActivateAbility never executes. The ability is definitely granted — you can verify with AbilitySystemComponent->GetActivatableAbilities(). But something between the trigger and the execution is saying no.

A common variant: the ability works the first time but fails after. Another: it works in a standalone test but fails in multiplayer. Both are symptoms of the same category of issue (state or authority), surfacing differently.

What Causes This

Cost effect not satisfied. If your ability has a CostGameplayEffect that subtracts 20 mana, and the caster has only 15, CheckCost returns false and activation is rejected. The attribute system does not log this; it just refuses silently.

Cooldown still active. CheckCooldown checks whether the cooldown tag is currently on the avatar. If the cooldown gameplay effect is still applied, activation fails. The UI may not show the cooldown because you forgot to bind to the cooldown tag change event.

Blocked by tags. ActivationBlockedTags lists tags that, if present on the avatar, block activation. If another ability added one of those tags (via ActivationOwnedTags) and never removed it, your ability cannot fire. Stuck tags from interrupted abilities are a common cause.

Required tags missing. ActivationRequiredTags must all be present on the avatar for activation. If you require State.Grounded but the character is airborne, activation fails. Often these requirements are added for prototyping and forgotten.

Authority mismatch. Abilities have a NetExecutionPolicy that dictates where they run (local predicted, server only, server initiated, etc.). Calling TryActivateAbility from the wrong side causes silent failure in multiplayer. Local predicted abilities activate immediately on the client but may be rejected by the server if state does not match.

Ability spec not granted. Granting abilities only works on the server (authority). If you granted abilities in BeginPlay on a character that is not yet authoritative, the grant silently fails on simulated proxies. The client sees the ability but cannot activate it because the server has no record.

The Fix

Step 1: Use showdebug abilitysystem. Run your game and open the console (backtick). Type showdebug abilitysystem. The HUD now shows the currently-selected actor’s gameplay ability system state: tags, active abilities, attributes, active effects, and cooldowns.

Press AbilitySystem.Debug.NextCategory to cycle through categories. Focus on “Tags” and “Abilities” for activation problems. Try the activation and watch for any tag that appears or changes — that is often the block.

Step 2: Enable verbose logging. Add this to DefaultEngine.ini:

[Core.Log]
LogAbilitySystem=Verbose
LogGameplayEffects=Verbose
LogGameplayTags=Verbose

Run the game and watch Output Log. Ability activation attempts log the specific reason for failure — cost not met, cooldown, tags, and so on. This is by far the fastest way to identify which gate is closed.

Step 3: Review cost and cooldown configuration. Open your ability asset. Inspect the Cost GameplayEffect and Cooldown GameplayEffect references. The cost effect should subtract from an attribute that can go negative temporarily (or use InstantCost with check logic); the cooldown effect should apply a tag with duration, not infinite.

Verify the cost math: if your ability costs 20 mana and your starting mana is 100, the ability should fire 5 times before failing. If it fires once and then silently stops, the cost is consuming more than expected (maybe a wrong attribute, maybe a scalable float calculation with a wrong curve).

Step 4: Audit tag blocks. Open the ability’s Tags section. Review:

A surprisingly common bug: State.Attacking is added to ActivationOwnedTags of ability A. Ability B blocks on State.Attacking. Ability A never clears its tags because it is interrupted by hit reaction before EndAbility runs. B is permanently blocked. Fix: ensure EndAbility runs in every path, including cancellation, or move the tag to AbilityTags if it should not persist during activation.

Step 5: Verify authority and netpolicy. For multiplayer, confirm the ability’s NetExecutionPolicy. Most player abilities should be LocalPredicted for responsive controls. ServerInitiated and ServerOnly work but add latency. Also ensure you are calling TryActivateAbility from the right side — from the owning client or from the server, per the policy.

// In C++ player character
void AMyCharacter::TryFireball()
{
    if (AbilitySystemComponent)
    {
        FGameplayTagContainer Tag;
        Tag.AddTag(FGameplayTag::RequestGameplayTag("Ability.Fireball"));

        AbilitySystemComponent->TryActivateAbilitiesByTag(Tag);
    }
}

Granting on the Right Side

Grant abilities only on authority (server). A common pattern:

void AMyCharacter::BeginPlay()
{
    Super::BeginPlay();

    if (HasAuthority() && AbilitySystemComponent)
    {
        for (TSubclassOf<UGameplayAbility> Ability : DefaultAbilities)
        {
            AbilitySystemComponent->GiveAbility(
                FGameplayAbilitySpec(Ability, 1, -1, this));
        }
    }
}

On clients, the abilities replicate down. Simulated proxies see the ability spec list but cannot activate — activation always originates from the owner or the server.

“GAS is powerful but silent. Every gate that blocks your ability does so quietly. showdebug and verbose logging are not optional — they are the primary tools.”

Related Issues

For Enhanced Input binding issues, see Unreal Enhanced Input Action Not Firing. For multiplayer replication patterns, Testing Cross-Platform Multiplayer covers related debugging approaches.

showdebug abilitysystem is the only GAS debugging tool that matters. Master it first.