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 need | Use | Where |
|---|---|---|
| A widget to respond to an event from the world | Bind Tag Event + Broadcast Tag Event | Quick start |
| A listener to be removed automatically when its actor is destroyed | Bind Tag Event (Managed) | Lifecycle |
| One object to listen on a dozen or more tags | listener group | Large projects |
| A receiver to get a value that was broadcast before the receiver existed | sticky (bRetain) | Broadcast |
| To see who broadcasts an event and who receives it | debugger panel | Debugger |
| The payload type to be enforced | tag → struct contracts | Contracts |
| An answer, not just a notification | request-response | Request-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.