Recommendation
Use a Boolean for one independent yes or no fact, an Enum for one value from a closed set, a Name for an opaque identifier, and Gameplay Tags for hierarchical labels and set-based queries.
Compare the options
Boolean
Choose when
- One fact is independently true or false.
- The fact does not overlap with a larger state set.
Tradeoffs
- Several related booleans can permit invalid combinations.
- A bool carries no category or hierarchy.
- Blueprint
- Use a Boolean variable.
- C++
- Use bool.
Enum
Choose when
- Exactly one value from a small closed set is valid.
- The set changes through code or asset type updates.
Tradeoffs
- One Enum does not represent several simultaneous states.
- Adding values changes the declared type.
- Blueprint
- Use a Blueprint Enum or a native Enum exposed to Blueprint.
- C++
- Declare a reflected UENUM.
Name
Choose when
- The value is an efficient identifier.
- Hierarchy, registration, containers, and tag queries are unnecessary.
Tradeoffs
- Project code must validate spelling and meaning.
- FName has no built-in gameplay hierarchy.
- Blueprint
- Use a Name variable.
- C++
- Use FName.
Gameplay Tag
Choose when
- Labels are hierarchical.
- Several labels may coexist.
- Designers extend the dictionary or queries need any, all, and none rules.
Tradeoffs
- The project needs a managed tag dictionary and naming policy.
- Loose tag creation can produce duplicate concepts.
- Blueprint
- Use Gameplay Tag, Gameplay Tag Container, Has Tag, Has Any, Has All, and Gameplay Tag Query.
- C++
- Use FGameplayTag, FGameplayTagContainer, FGameplayTagQuery, and native tag declarations.
Requirements
Gameplay Tags use the GameplayTags module. Add GameplayTags to Build.cs for C++ access.
Example
Use an Enum when only one Movement Mode can be active. Use Tags for State.Stunned, State.Burning, and Ability.Blocked.Movement because several can coexist and parent queries matter.