generated from pancake-llc/package
-
Notifications
You must be signed in to change notification settings - Fork 17
Messenger
Aprius edited this page Oct 30, 2024
·
7 revisions
Basic message bus for unity,
- Using struct for declare events - no garbage
- Binding based or direct subscription, no interfaces
- High performance
1, Create message
public readonly struct SpawnInGameNotiMessage : IMessage
{
}
2, Setup
private MessageBinding<SpawnInGameNotiMessage> _binding;
private void OnEnable()
{
_binding ??= new MessageBinding<SpawnInGameNotiMessage>(OnSpawn);
_binding.Listen = true;
}
private void OnDisable() { _binding.Listen = false; }
private void OnSpawn(SpawnInGameNotiMessage msg)
{
// TO_DO
}
3, Raise
Messenger<SpawnInGameNotiMessage>.Raise(new SpawnInGameNotiMessage());
1, You can add more callback for binding via method Add
and remove callback by call Remove
private void OnEnable()
{
_binding ??= new MessageBinding<SpawnInGameNotiMessage>(OnSpawn);
_binding.Listen = true;
_binding.Add(AnotherCallback);
...
_binding.Remove(AnotherCallback);
}
private void AnotherCallback(SpawnInGameNotiMessage msg)
{
// TO_DO
}
2, If you only want the callback to be called once, use AddCallback
via Messenger
public void Register()
{
Messenger<SpawnInGameNotiMessage>.AddCallback(OnceTimeCallback);
}
private void OnceTimeCallback(SpawnInGameNotiMessage msg)
{
// Callback will be called precisely once, then dropped
}
3, Waiting message raise
private async Task WaitForMessageRaise()
{
var awaiter = Messenger<SpawnInGameNotiMessage>.GetAwaiter();
var eventMessage = await awaiter.Task;
Debug.Log($"Received event message: {eventMessage}");
}
public async void Start()
{
Debug.Log("Waiting for SpawnInGameNotiMessage...");
await WaitForMessageRaise();
Debug.Log("Event received and handled.");
}