Skip to content

End‑to‑End Example: Scene Transitions + Overlay Pause

Short intro

An end‑to‑end pattern showing scene‑scoped buses, a global overlay that persists across scenes, and pausing emissions/listeners safely.

Scenario

  • Each scene has its own local MessageBus for scene‑scoped flows.
  • A global overlay persists across scenes and listens to global notifications.
  • During pause, some systems should stop processing (Disable tokens), but others still emit (emit while disabled).

Setup

C#
using DxMessaging.Core;
using DxMessaging.Core.MessageBus;
using UnityEngine;

public static class SceneBus
{
    public static MessageBus Current { get; private set; } = new MessageBus();
    public static void NewScene() => Current = new MessageBus();
}

Messages

C#
using DxMessaging.Core.Attributes;

[DxUntargetedMessage][DxAutoConstructor]
public readonly partial struct SceneLoaded { public readonly int buildIndex; }

[DxUntargetedMessage][DxAutoConstructor]
public readonly partial struct Paused { }

[DxUntargetedMessage][DxAutoConstructor]
public readonly partial struct Resumed { }

Global overlay (persists across scenes)

C#
using DxMessaging.Unity;
using DxMessaging.Core.Messages;
using UnityEngine;

public sealed class GlobalOverlay : MessageAwareComponent
{
    protected override void RegisterMessageHandlers()
    {
        base.RegisterMessageHandlers();
        DontDestroyOnLoad(gameObject);
        _ = Token.RegisterUntargeted<SceneLoaded>(OnSceneLoaded);
        _ = Token.RegisterUntargeted<Paused>(m => ShowPause());
        _ = Token.RegisterUntargeted<Resumed>(m => HidePause());
    }

    private void OnSceneLoaded(ref SceneLoaded m) => RebuildUIForScene(m.buildIndex);
}

Scene systems (use local bus)

C#
using DxMessaging.Core;
using DxMessaging.Core.MessageBus;
using DxMessaging.Core.Messages;

public sealed class SceneDriver
{
    public void OnSceneStart(int buildIndex)
    {
        // Switch to a fresh bus per scene
        SceneBus.NewScene();

        // Broadcast globally (untargeted) so overlay updates
        var info = new SceneLoaded(buildIndex);
        info.Emit();

        // For scene‑local flows, pass the local bus to tokens
        // var token = MessageRegistrationToken.Create(handler, SceneBus.Current);
    }
}

Pausing

C#
using DxMessaging.Unity;
using UnityEngine;

public sealed class PauseController : MonoBehaviour
{
    public MessagingComponent[] systemsToPause; // listeners to disable during pause

    public void Pause()
    {
        foreach (var mc in systemsToPause)
        {
            mc.ToggleMessageHandler(false); // disable listeners
        }

        var p = new Paused(); p.Emit(); // overlay still listening globally
    }

    public void Resume()
    {
        var r = new Resumed(); r.Emit();
        foreach (var mc in systemsToPause)
        {
            mc.ToggleMessageHandler(true);
        }
    }
}

Emitting while disabled

C#
// For specific emitters that must keep sending even if disabled:
messaging.emitMessagesWhenDisabled = true;

Notes

  • Use global untargeted messages to communicate scene transitions to global overlays.
  • Keep scene‑specific flows isolated on a per‑scene bus (pass to tokens for registrations and emit to it).
  • Toggle listeners off to pause, and opt into emission while disabled for emitters that must remain active.