UE5 Gameplay Ability System without the C++ chapter
By the Cosindra team · Updated August 7, 2026
The Gameplay Ability System is Unreal’s framework for abilities, attributes and status effects — the thing Fortnite and Paragon were built on. It is genuinely good, and it has a reputation for being hard, which is mostly the reputation of its setup rather than its ideas.
This guide explains the four pieces you actually need to hold in your head, the one design decision people get wrong (what a Gameplay Effect duration means), and the calls that put a working ability on an actor.
Four pieces, and what each is for
Everything in GAS is one of four things, and most confusion comes from mixing up which is which.
| Piece | What it is | Example |
|---|---|---|
| Ability System Component | The hub that lives on an actor and owns everything else | One per character |
| Attribute Set | The numbers — a struct of gameplay attributes | Health, Mana, MoveSpeed |
| Gameplay Ability | A thing the actor can do, with its own activation rules | Fireball, Dash, Block |
| Gameplay Effect | The only sanctioned way to change an attribute | Deal 30 damage, drain mana, slow for 4s |
| Gameplay Tag | A hierarchical label used for state and blocking | State.Stunned, Ability.Fire |
Why attributes are not just variables
An attribute looks like a float on a component, and you could write one yourself. What you would be rebuilding is the pipeline around it: attributes have a base value and a current value, changes route through effects that other systems can inspect and cancel, and the whole thing replicates with prediction already handled.
That pipeline is the reason a damage number can be reduced by armour, doubled by a buff, and blocked outright by an immunity tag without any of those three systems knowing about each other. A plain float gives you none of it, and the moment you add the second modifier you start writing GAS badly.
Instant, Duration, Infinite — pick the wrong one and nothing behaves
A Gameplay Effect has a duration policy and it decides which value gets modified. Instant permanently changes the base value — this is damage and healing. Has Duration and Infinite temporarily change the current value and revert when they end — these are buffs, debuffs and auras.
Using Instant for a buff means the bonus never goes away. Using Has Duration for damage means the health comes back on its own. Neither produces an error; both produce a game that feels haunted, which is why this is worth getting right before you build ten abilities on top of it.
Cost and cooldown are effects, not code
A new GAS user usually writes a mana check and a timer inside the ability. GAS expects neither. An ability points at a Cost effect and a Cooldown effect, and the framework refuses activation when the cost cannot be paid or the cooldown tag is present.
The payoff is that everything else can see it: a UI can grey out the button by asking the same question the activation check asks, and a "reduce all cooldowns" buff is one more effect rather than a special case in every ability you have written.
The editor calls that scaffold it
Order matters here more than anywhere else in this batch — attributes have to exist before effects can name them, and effects have to exist before an ability can point at them as its cost.
| # | Tool | What it does |
|---|---|---|
| 1 | create_attribute_set | Creates the attribute set — Health, Mana, Stamina and friends |
| 2 | create_gameplay_effect | Builds the effects: the damage, the cost, the cooldown |
| 3 | create_ability | Creates the ability and points it at its cost and cooldown effects |
| 4 | add_ability_to_actor | Grants the ability to a character so it can be activated |
| 5 | apply_gameplay_effect | Applies an effect directly — how damage lands on a target |
| 6 | add_gameplay_tag | Tags state for blocking and querying (State.Stunned and similar) |
| 7 | remove_gameplay_tag | Clears state when the condition ends |
| 8 | get_ability_system_info | Reads back what an actor currently has granted and applied |
Put an AI copilot inside your editor
The free Cosindra desktop app connects to your UE 5.7/5.8 project — the assistant works in your open editor, and what you generate with the web tools applies straight into it. Windows & macOS.
Download CosindraFrequently asked questions
Do I need C++ to use the Gameplay Ability System in UE5?
For abilities and effects, no — those are Blueprint classes and always have been. The historical C++ requirement is the Attribute Set: attributes are declared as C++ properties with generated accessors, and there is no Blueprint equivalent in stock UE. So a project can be almost entirely Blueprint with one small C++ class holding the attributes, which is a very different proposition from "GAS is a C++ framework".
What is the difference between an Attribute and a normal Blueprint variable?
An attribute carries a base value and a current value, and every change to it is routed through a Gameplay Effect that other systems can inspect, modify or reject. That is what lets armour reduce incoming damage, a buff scale it, and an immunity tag cancel it without any of those systems referencing each other. A Blueprint float gives you the number and nothing else — you can build the same behaviour by hand, but you will have rebuilt GAS, worse.
When should a Gameplay Effect be Instant versus Has Duration?
Instant modifies the base value permanently and is what damage and healing are. Has Duration and Infinite modify the current value and revert when they expire or are removed, which is what buffs, debuffs, slows and auras are. The quick test: if the change should survive the effect ending, it is Instant. If it should undo itself, it is not.