Skip to content

Messenger

Aprius edited this page Oct 30, 2024 · 7 revisions

What

Basic message bus for unity,

  • Using struct for declare events - no garbage
  • Binding based or direct subscription, no interfaces
  • High performance

Usages

Basic

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());

Advanced

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.");
}
Clone this wiki locally