TagEventBus documentation

Table of contents

The sender broadcasts an event on a tag. The receiver listens on the same tag. Neither side knows the other, and neither holds a pointer to the other.

Find the right API for your task

I needUseWhere
A widget to respond to an event from the worldBind Tag Event + Broadcast Tag EventQuick start
A listener to be removed automatically when its actor is destroyedBind Tag Event (Managed)Lifecycle
One object to listen on a dozen or more tagslistener groupLarge projects
A receiver to get a value that was broadcast before the receiver existedsticky (bRetain)Broadcast
To see who broadcasts an event and who receives itdebugger panelDebugger
The payload type to be enforcedtag → struct contractsContracts
An answer, not just a notificationrequest-responseRequest-Response

Limits worth knowing before your first line of code

  • Game Thread only. The registry is not thread-safe. You bind and broadcast from the Game Thread.
  • No replication. The bus is local to the game instance. An event broadcast on a client does not appear on the server.
  • Every tag has to exist in the project’s Gameplay Tag list. A tag outside that list is rejected, both on broadcast and on bindmanual approve 1.0.0 — the Blueprint nodes log a Warning; the low-level C++ API stays silent.
  • The diagnostic layer is excluded from Shipping builds. The debugger panel, the history, and the statistics live behind #if !UE_BUILD_SHIPPING. Production logic runs unchangedmanual approve 1.0.0.

The full set of limits: Limits and threading.

How to read the evidence markers

Most statements in this documentation are supported by function signatures in the code. Some claims describe behavior that no header shows — in what order the delivery gates run, what the debugger panel does, what disappears in Shipping. Those sentences end with a manual approve marker and a version number. The marker means that the claim is based on manual testing by the author, rather than code inspection.

The color of the marker says one thing: whether the evidence comes from this release.

  • Teal — confirmed for the version described on this page.
  • Amber — confirmed earlier, before the current release. The behavior has probably not changed, but nobody has checked it since that version.

Hover over a marker to see the engine version and the date of the confirmation. A marker standing alone above or below a table refers to the whole table, not to a single row.

Glossary

Global bus — UTagEventBusSubsystem on the GameInstance. It is created automatically and works as soon as the plugin is enabled, with no configurationmanual approve 1.0.0.

Local bus — UTagEventBusComponent on an actor. A separate registry, not a filter over the global one. It is created only when you explicitly add the component or enable bCreateLocalIfMissing when binding.

Listener — a single subscription: an object, a tag, and a handler, tied together by one Bind call.

Broadcast — sending an event on a tag. The sender does not call the receiver directly and finishes its work whether or not anyone is listening.

Channel — the set of listeners registered on one specific tag.

Partial match — the listener also matches child tags. Without it, a listener on Combat will not see Combat.Hit.

Sticky — a broadcast with bRetain, retained in the channel. A new listener with bReplaySticky gets the last retained value immediately after it registers.

Handle — the FTagEventHandle returned when you bind, and the only way to unbind one specific listener.

Release-by-release history: Changelog.