Chapter 20

GameplayTags & System Design Tradeoffs

GameplayTags used well beyond GAS — Blueprint interfaces, save systems, data tables, AI blackboards — and the decision framework for picking between a tag, an enum, a delegate, an interface, and a subclass.

In this chapter

  1. Core Use Cases
  2. Best Practices
  3. Choosing Between Tags, Enums, Delegates, Interfaces, Subclasses
  4. The GAS-Specific Design Principle
1

Core Use Cases

Chapter 15 introduced Gameplay Tags inside GAS. That's their most visible home, but the tag system is general-purpose — it shows up in Blueprint interfaces, save systems, data tables, and AI blackboards just as often.


2

Best Practices


3

Choosing Between Tags, Enums, Delegates, Interfaces, Subclasses

The core question before adding a tag: is this a closed set you control, or an open set others — designers, future-you, other systems — will extend?

NeedReach forWhy
Binary state on an actor, queried across systemsGameplayTag on the ASCExtensible, auto-managed by Gameplay Effect duration
Fixed internal mode (small N)enumCompile-time safety, no string overhead
Notify others when X happensDelegateDirect, typed payload, no polling (Chapter 13)
Unrelated actor types share a capabilityInterfaceA contract without inheritance coupling (Chapter 19)
Shared replicated fact all clients needComponent or property on GameStateReplication is the point (Chapter 5)
Cross-system categorization/filtering (abilities, cues, damage types)GameplayTagHierarchical AND/OR querying across decoupled systems
General gut-check before adding any new system — tag, delegate, interface, or subclass. Does this need to be known or queryable by something outside this actor: designers, other systems, the network? If yes, reach for a tag or replicated data. If it's purely internal bookkeeping, keep it a private member. Overusing tags as stringly-typed internal-only state is the most common GAS anti-pattern.

4

The GAS-Specific Design Principle

Push logic into data, identity into tags, and keep the C++ generic. Avoid a subclass explosion — UGA_FireballWeak, UGA_FireballStrong, and so on — in favor of fewer, generic ability and effect classes differentiated by tags, SetByCaller magnitudes, and data tables.

If a new UGameplayAbility subclass would differ from an existing one only by a number or a tag, parameterize instead of subclassing.

Interview drill

Answer each out loud before re-reading the chapter.

  1. Where do GameplayTags show up outside of GAS?
  2. How do you decide between a GameplayTag and an enum for a given piece of state?
  3. Walk through the decision table: tag vs. enum vs. delegate vs. interface vs. a component on GameState.
  4. How do you avoid a subclass explosion in a GAS-based ability set?
← Chapter 19 ↑ Index Chapter 21 →