Skip to content

Lightweight, strongly typed pub/sub messenger for .NET game loops with immediate or end-of-frame (queued) delivery.

Notifications You must be signed in to change notification settings

olivegamestudio/GameMessenger

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

GameMessenger

Lightweight, strongly typed pub/sub messenger for game loops. GameMessenger lets systems talk without tight coupling and supports both immediate and queued (pumpable) delivery.

Features

  • Strongly typed subscribe/publish API with SubscriptionToken for safe unsubscription
  • Immediate delivery or queued delivery you process later with PumpQueued
  • Handlers can unsubscribe themselves while messages are flowing (dispatch uses snapshots)
  • Tiny surface area: IGameMessenger, GameMessenger, Delivery, SubscriptionToken

Getting Started

  1. Reference the library (package name OliveGameStudio.Messenger when published) or add the project directly:
    dotnet add package OliveGameStudio.Messenger
    # or
    dotnet add reference src/OliveGameStudio.Messenger.csproj
  2. Create a messenger and subscribe:
    using OliveGameStudio;
    
    var messenger = new GameMessenger();
    
    var spawnedToken = messenger.Subscribe<PlayerSpawned>(msg =>
    {
        Console.WriteLine($"Spawned {msg.Id} at {msg.Position}");
    });
    
    messenger.Publish(new PlayerSpawned("alpha", (0, 0)));
    // For queued subscriptions, call PumpQueued() each frame to flush the queue.

Delivery Modes

  • Delivery.Immediate: handlers fire as soon as Publish is called.
  • Delivery.EndOfFrame: handlers are queued; call PumpQueued() (e.g., once per frame) to run them.

Example mixing both:

var messenger = new GameMessenger();

// Immediate handler
messenger.Subscribe<DamageTaken>(d => Console.WriteLine($"HP - {d.Amount}"), Delivery.Immediate);

// Queued handler (batch damage at end of frame)
messenger.Subscribe<DamageTaken>(d => pendingDamage += d.Amount, Delivery.EndOfFrame);

messenger.Publish(new DamageTaken(5));

// Later in the frame loop
messenger.PumpQueued();

Unsubscribing

Keep the SubscriptionToken to remove a handler later:

var token = messenger.Subscribe<InputEvent>(_ => HandleInput(), Delivery.Immediate);
// ... when no longer needed
messenger.Unsubscribe<InputEvent>(token);

Threading

GameMessenger is not thread-safe; interact with it from the same thread (typically your main game loop).

Building Locally

cd src
dotnet build OliveGameStudio.Messenger.csproj

License

Add your license information here.

About

Lightweight, strongly typed pub/sub messenger for .NET game loops with immediate or end-of-frame (queued) delivery.

Topics

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages