Unity Integration¶
Unity‑centric helpers make registration lifecycles explicit and safe.
MessagingComponent¶
- Attach to any GameObject that will send or receive messages.
- Creates a per-owner
MessageHandlerand offersCreate(this)to get aMessageRegistrationToken. - Call
Configure(IMessageBus, MessageBusRebindMode)beforeCreateif you want the component to use a custom bus (e.g., one resolved from a DI container). PassingMessageBusRebindMode.RebindActivemigrates current registrations;PreserveRegistrationsdefers the swap until the next enable. - Optional: set
emitMessagesWhenDisabledif you need to emit while disabled.
MessageAwareComponent¶
- Derive for a batteries‑included pattern; it manages a token for you.
- Override
RegisterMessageHandlers()to stage registrations. - The token is enabled/disabled with the component’s enable state.
- Call
ConfigureMessageBus(IMessageBus, MessageBusRebindMode)beforebase.Awake()(or shortly after via a DI bootstrapper) to ensure the token is created against your container-provided bus.
C#
using DxMessaging.Unity;
using DxMessaging.Core.Messages;
public sealed class HealthComponent : MessageAwareComponent
{
protected override void RegisterMessageHandlers()
{
base.RegisterMessageHandlers();
_ = Token.RegisterComponentTargeted<TookDamage>(this, OnTookDamage);
_ = Token.RegisterUntargeted<WorldRegenerated>(OnWorldRegenerated);
}
private void OnTookDamage(ref TookDamage m) => Apply(m.amount);
private void OnWorldRegenerated(ref WorldRegenerated m) => Reset();
}
Do's¶
- Use
MessageAwareComponentwhen possible to avoid boilerplate. - Override
RegisterMessageHandlers()and bind to named methods. - Keep handlers small and fast; offload heavy work.
Don'ts¶
- Don’t register in Update; register once and enable/disable with component state.
- Don’t forget to call
base.RegisterMessageHandlers()if your subclass relies on base registrations.
Important: Inheritance and base calls¶
MessageAwareComponentuses many virtual methods (e.g.,Awake,OnEnable,OnDisable,RegisterMessageHandlers).- CRITICAL: If you override any of these, you MUST call the base method:
base.Awake(),base.OnEnable(),base.OnDisable(),base.RegisterMessageHandlers(). - Always call
base.RegisterMessageHandlers()first in your override—this ensures parent class registrations happen before yours. - Skipping base calls can break core setup (token creation/enable) and default string‑message registrations.
- If you need to opt out of string demos, prefer overriding
RegisterForStringMessages => falserather than removing the base call. - Don't hide Unity methods with
new(e.g.,new void OnEnable()); alwaysoverrideand callbase.*.
Registration timing¶
- Prefer
Awake()for registration rather thanStart(). MessageAwareComponentautomatically callsRegisterMessageHandlers()inAwake().- Early registration in
Awake()ensures handlers are ready before other components'Start()methods run. - If you need custom setup before registration, override
Awake(), do your setup, then callbase.Awake().
Manual token management¶
C#
using DxMessaging.Unity;
using DxMessaging.Core;
using DxMessaging.Core.Messages;
[RequireComponent(typeof(MessagingComponent))]
public sealed class InventoryUI : UnityEngine.MonoBehaviour
{
private MessagingComponent _messaging;
private MessageRegistrationToken _token;
private void Awake()
{
_messaging = GetComponent<MessagingComponent>();
_token = _messaging.Create(this);
_ = _token.RegisterUntargeted<WorldRegenerated>(OnWorld);
_ = _token.RegisterComponentTargeted<TookDamage>(this, OnDamage);
}
private void OnEnable() => _token.Enable();
private void OnDisable() => _token.Disable();
private void OnWorld(ref WorldRegenerated m) { /* update UI */ }
private void OnDamage(ref TookDamage m) { /* flash damage */ }
}
Manual enable/disable (advanced)¶
C#
public sealed class AlwaysListening : MessageAwareComponent
{
protected override bool MessageRegistrationTiedToEnableStatus => false; // keep token enabled
protected override void RegisterMessageHandlers()
{
base.RegisterMessageHandlers();
_ = Token.RegisterUntargeted<MyEvent>(OnEvent);
Token.Enable(); // explicitly enable once
}
private void OnEvent(ref MyEvent m) { /* ... */ }
}
String message demos (opt‑out)¶
C#
public sealed class NoStringDemos : MessageAwareComponent
{
protected override bool RegisterForStringMessages => false;
protected override void RegisterMessageHandlers()
{
// only your registrations
}
}
ReflexiveMessage (bridging legacy SendMessage)¶
C#
using DxMessaging.Core;
using DxMessaging.Core.Messages;
var msg = new ReflexiveMessage("OnHit", ReflexiveSendMode.Upwards, 10);
msg.EmitGameObjectTargeted(gameObject);
Related