Back to Index | FAQ | Getting Started | Glossary
- Ensure your
MessageRegistrationTokenis enabled (Enable inOnEnable, Disable inOnDisable). - Verify the category matches the emission (Untargeted vs Targeted vs Broadcast).
- Targeted/Broadcast require a valid
InstanceId; ensure the target/source object exists when you emit. - In Unity, confirm your
MessagingComponentexists on sender/receiver GameObjects. - CRITICAL: If inheriting from
MessageAwareComponent, ensure your overrides call base methods:base.RegisterMessageHandlers()- Call this FIRST in your override to preserve default setup (including string message demos) and parent class registrations.base.Awake()- Call this if you overrideAwake(), or your token won't be created (this is the #1 cause of handlers not firing).base.OnEnable()/base.OnDisable()- Call these so the token actually enables/disables.base.OnDestroy()- Call this if you overrideOnDestroy(), or registrations leak past the component's lifetime and held references prevent GC.- Never use
newto hide Unity methods (e.g.,new void OnEnable()); always useoverrideand callbase.*. - For the complete table of guarded methods and the exact failure mode for each, see Inheritance and base calls in the quickstart.
Registration timing
- ALWAYS register message handlers in
Awake(), notStart(). MessageAwareComponentautomatically callsRegisterMessageHandlers()inAwake().- Registering in
Awake()ensures handlers are ready before other components'Start()methods run. - If you register in
Start(), you may miss messages emitted by other components in theirStart()methods.
Unexpected ordering
- Check
priorityvalues on registrations; lower runs earlier. Same priority is registration order. - Interceptors always precede handlers and can cancel; confirm interceptors return
true.
Double registration or over-deregistration warnings
- Avoid calling stage/enable multiple times; pair registrations and lifecycles consistently.
- Review logs with
bus.Log.Enabled = trueto see the registration history.
Allocations/boxing
- Prefer struct messages implementing the generic interfaces:
I*Message<T>. - Use by-ref handler overloads to avoid copies.
Emitting while disabled
- If you need to emit when a component is disabled, use a bus not tied to enable state or set
emitMessagesWhenDisabledonMessagingComponent.
Diagnostics overhead
- Disable diagnostics in release builds (
IMessageBus.GlobalDiagnosticsMode = false).
- Read
bus.OccupiedTypeSlotsandbus.OccupiedTargetSlots(or the globalMessageHandler.MessageBus.OccupiedTypeSlots/OccupiedTargetSlots) at region boundaries to see whether per-type or per-target slots are the culprit. - Call
MessageHandler.TrimAll(force: true)(orbus.Trim(force: true)) at scene unload or other natural transitions. Slots that survive a forced trim correspond to active registrations. - Tune the reclamation policy through
DxMessagingRuntimeSettings. See the Memory Reclamation guide for tuning recommendations and a leak-watching pattern.
- Get Unstuck
- to FAQ -- Common questions answered
- to Getting Started -- Learn the basics
- to Glossary -- Understand the terminology
- Debug & Inspect
- to Diagnostics -- Inspector tools and debugging
- to Listening Patterns -- Verify you're listening correctly
- to Message Types -- Ensure you're using the right type
- Examples
- to Mini Combat sample -- See working code
- to Common Patterns -- Real-world solutions