Resource
Best Practices
Naming conventions, depth guidelines, and common mistakes to avoid when working with gameplay tags.
Naming conventions
Format
Gameplay tags use PascalCase with dots as separators. No spaces, no hyphens, no underscores in the tag string itself.
Ability.Melee.LightAttackGoodPascalCase, dot-separated, descriptiveability.melee.light_attackBadLowercase, underscoresAbility-Melee-LightAttackBadHyphens instead of dotsLightAttackBadNo hierarchy, can't use parent matchingRoot categories
The first segment of a tag is the category. It's ideal to declare root categories as native tags in C++ so they exist before any config file loads. Categories are nouns. Leaves can be nouns, adjectives, or past participles.
AbilityAbility identification, activation states, failure reasonsCooldownCooldown identifiers per ability or slotDamageDamage type classificationEventGameplay events sent between systemsGameplayCueVFX/SFX feedback (engine-required prefix)InputTagMapping Enhanced Input actions to gameplayMovementMovement mode tagsSetByCallerData-passing tags for GE modifiersStateActor state flags (dead, stunned, aiming)StatusStatus effects (burn, poison, bleed)UICommonUI layer and action routingWeaponWeapon identification and attributesTag depth
Most tags land at 3 levels deep. Going deeper than 4 usually means the hierarchy is doing too much work and should be split into separate categories.
Damage.FireAbility.ActivateFail.CooldownGameplayCue.Weapon.Impact.MetalTags vs enums
Use gameplay tags when
- +The set of values will grow over time
- +You need hierarchical matching (
DamagecatchesDamage.Fire) - +Designers need to add new values without code changes
- +Multiple systems need to query the same state
- +You want data-driven configuration via .ini or data tables
Use enums when
- −The set is fixed and small (for example, North/South/East/West)
- −You need switch statement exhaustiveness at compile time
- −Performance matters in a tight inner loop
- −Values map 1:1 to associated data (enum-indexed arrays)
Tag governance
Treat the tag dictionary the same way you treat a database schema. Changes ripple across every system that references a tag.
- 01Keep a single source of truth: either
DefaultGameplayTags.inior a native tag module in C++. - 02Use separate .ini files per domain or team:
Config/Tags/AbilityTags.ini,Config/Tags/AITags.ini. - 03Use restricted tags for root categories that only specific modules can extend.
- 04Review tag additions in code review. A new tag affects every system that queries its parent.
- 05Every tag deserves a DevComment. This helps other developers, and future you.
Anti-patterns
Damage.50FireDamageState.Dead and Status.DeathState.X3Unreal Directive is free and ad-free.
If it saved you time, you can help keep it that way.

