TagFlow is a minimal, focused Unreal Engine plugin providing a replicated local Gameplay Tag store and a unified query layer. Add, remove, and query Gameplay Tags across GAS and non-GAS actors through one consistent API — no boilerplate, no complexity.
FGameplayTagContainer on any actor. Add and remove tags via Add Tag / Remove Tag. Delegates fire on add/remove for reactive Blueprint logic (UI, VFX, etc.) without polling. Toggle b Replicate Tags (default: on) — the owning actor must replicate.Object Has Tag works on any UObject — inventory items, data assets, narrative items — without requiring TagFlow interfaces. TagFlow scans conventional tag properties via reflection: Tags, ItemTags, GameplayTags, TagContainer, LocalTags. Register custom providers for non-standard objects.GetTagFlowComponent() — avoids FindComponentByClass calls throughout your codebase. UTagFlowComponent implements this automatically.Actor Has Tag, Object Has Tag, Add Tag To Actor, Remove Tag From Actor directly.Actor Has Tag returns true if the tag is on the component or the ASC. Enable Push Tags To ASC on the component to keep both systems in sync — Add/Remove on TagFlow also adds/removes from the ASC as loose tags.All functions are Blueprint Callable or Blueprint Pure. Properties are Blueprint Read Only.
| Property / Function | Description |
|---|---|
| Local Tags | The replicated FGameplayTagContainer. Readable in Blueprint and Details panel. |
| b Replicate Tags | If true (default), Local Tags replicate. Owning actor must replicate. |
| b Push Tags To ASC | If true (default) and actor has ASC, Add/Remove also update the ASC as loose tags. |
| Add Tag(Tag) | Add one tag to Local Tags. Replicates; fires On Tag Added delegate locally. |
| Remove Tag(Tag) | Remove one tag from Local Tags. Fires On Tag Removed delegate locally. |
| Has Local Tag(Tag) | Returns true if Local Tags contains the given tag. |
| Has Any Local Tags(Container) | Returns true if Local Tags contains any tag in the container. |
| Has All Local Tags(Container) | Returns true if Local Tags contains all tags in the container. |
| Get Local Tags Copy() | Returns a copy of Local Tags (safe to iterate in Blueprint). |
| On Tag Added | Delegate fires when a tag is added — use for reactive UI, VFX, animation triggers. |
| On Tag Removed | Delegate fires when a tag is removed. |
| Node / Function | Inputs | Description |
|---|---|---|
| Actor Has Tag | World Context, Actor, Tag | True if actor has tag via TagFlow component OR ASC (if GAS enabled) |
| Object Has Tag | World Context, Object, Tag | Works on actors AND any UObject with conventional tag properties (Items, Assets, etc.) |
| Add Tag To Actor | World Context, Actor, Tag | Add tag to actor's TagFlow component (and ASC if present) |
| Remove Tag From Actor | World Context, Actor, Tag | Remove tag from actor's TagFlow component (and ASC if present) |
Tags, ItemTags, GameplayTags, TagContainer, or LocalTags of type FGameplayTagContainer or FGameplayTag. Inventory items, narrative assets, or any UObject with these properties work out of the box — no plugin dependency required. For custom property names, register a provider: Subsystem->RegisterObjectTagProvider(UMyClass::StaticClass(), lambda).The optional TagFlowNarrative runtime module links TagFlow and Narrative Pro (requires the NarrativeArsenal module). Enable only when using both.
UNarrativeCondition_TagFlowHasGameplayTag to any dialogue line or node. Set Required Tag. Checks the pawn Narrative passes into the condition using TagFlow + ASC — no Blueprint world-context pitfalls. Use the condition's Not flag to invert ("does NOT have tag").Narrative Participant Has Tag — query a pawn for a tag from within dialogue events. Narrative Participant Add Tag / Remove Tag — grant or strip tags on that pawn directly from dialogue or quest events.Actor Has Tag, Object Has Tag, or Get Tag Flow inside nodes that run on the animation worker thread (e.g. inside Blend Poses by bool) will produce a "potentially thread-unsafe call" warning and can cause race conditions.Fix — Option 1: Select the node (e.g. Blend Poses by bool), open Details, and disable the option that enables worker-thread update.
Fix — Option 2 (preferred): In the Event Graph, call Actor Has Tag inside Event Blueprint Update Animation or Event Tick, store the result in a bool variable, then use that variable in the Animation Graph instead of calling TagFlow there. The anim thread only reads the cached bool.
// Via component directly
if (UTagFlowComponent* TF = Actor->FindComponentByClass<UTagFlowComponent>())
{
TF->AddTag(MyTag);
if (TF->HasLocalTag(MyTag)) { /* ... */ }
FGameplayTagContainer Copy = TF->GetLocalTagsCopy();
}
// Via interface (avoids GetComponentByClass)
if (ITagFlowInterface* TF = Cast<ITagFlowInterface>(Actor))
TF->GetTagFlowComponent()->AddTag(MyTag);
// Via subsystem (unified query: component + optional ASC)
if (UTagFlowSubsystem* Sub = World->GetSubsystem<UTagFlowSubsystem>())
{
if (Sub->ActorHasTagForWorld(Actor, MyTag)) { /* ... */ }
Sub->AddTagToActorForWorld(Actor, MyTag);
// Works on ANY UObject (actors, items, assets...)
if (Sub->ObjectHasTagForWorld(SomeInventoryItem, MyTag)) { /* ... */ }
}
A lightweight, focused tool for any UE 5.7+ project. Available on the FAB Marketplace.