Darksaint Games

TagFlow

UE 5.7+ · Gameplay Utility
Available TagsGASReplication

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.

EngineUE 5.7+
StudioDarksaint Games
GASOptional
ReplicationSupported
TagFlow
🏷
What TagFlow Provides
📦
UTagFlowComponent — Replicated Tag Store
Holds a single replicated 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.
🔍
UTagFlowSubsystem — Unified Query Layer
World subsystem providing one API to check tags on any actor or object. Checks the TagFlowComponent first, then (if GAS is enabled) reads the actor's ASC — resolving it from the actor, PlayerState, Controller, or Owner automatically. No manual setup required.
🌐
Object Has Tag — Universal Query
Beyond actors, 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.
🔌
ITagFlowInterface
Type-safe actor interface with GetTagFlowComponent() — avoids FindComponentByClass calls throughout your codebase. UTagFlowComponent implements this automatically.
🎛
UTagFlowBPLibrary — Blueprint Nodes
Static Blueprint nodes that don't require holding a subsystem reference. Pass any World Context Object (e.g. Self) and call Actor Has Tag, Object Has Tag, Add Tag To Actor, Remove Tag From Actor directly.
Optional GAS Sync
When GameplayAbilities is enabled, 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.
📋
Component API Reference

All functions are Blueprint Callable or Blueprint Pure. Properties are Blueprint Read Only.

Property / FunctionDescription
Local TagsThe replicated FGameplayTagContainer. Readable in Blueprint and Details panel.
b Replicate TagsIf true (default), Local Tags replicate. Owning actor must replicate.
b Push Tags To ASCIf 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 AddedDelegate fires when a tag is added — use for reactive UI, VFX, animation triggers.
On Tag RemovedDelegate fires when a tag is removed.
🔍
Blueprint Library & Subsystem API
Node / FunctionInputsDescription
Actor Has TagWorld Context, Actor, TagTrue if actor has tag via TagFlow component OR ASC (if GAS enabled)
Object Has TagWorld Context, Object, TagWorks on actors AND any UObject with conventional tag properties (Items, Assets, etc.)
Add Tag To ActorWorld Context, Actor, TagAdd tag to actor's TagFlow component (and ASC if present)
Remove Tag From ActorWorld Context, Actor, TagRemove tag from actor's TagFlow component (and ASC if present)
Object Has Tag — Convention List
TagFlow scans for properties named 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).
🎭
Narrative Pro Integration (Optional Module)

The optional TagFlowNarrative runtime module links TagFlow and Narrative Pro (requires the NarrativeArsenal module). Enable only when using both.

Narrative Condition: "Tag Flow: Has Gameplay Tag"
Add 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").
💬
Blueprint Nodes: TagFlow | Narrative
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.
Animation Blueprint Thread Safety
Do NOT call TagFlow on the animation worker thread
Calling 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.

💻
C++ Usage
// 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)) { /* ... */ }
}

Get TagFlow

A lightweight, focused tool for any UE 5.7+ project. Available on the FAB Marketplace.