feat: integrate composable Godot runtime and EventBus debugger

This commit is contained in:
cneicy committed 2026-11-06 19:18:54 +08:00
1 parent 0d9e04c09d
commit 51f8a1d044
55 files changed
+1481 -114

No files matched your search

@@ -0,0 +1,62 @@
#nullable enable
using System;
using Godot;
using ShrinkEventBus;
public partial class WorldDemoWorld : Node
{
private IDisposable? _binding;
private bool _restoring = true;
private readonly DemoWorldSubscriber _subscriber = new();
public ShrinkBusKey Key { get; } = ShrinkBusKey.World(Guid.NewGuid().ToString("N"));
public IShrinkEventBus Bus { get; private set; } = null!;
public int ReadyCount => _subscriber.ReadyCount;
public int EffectCount => _subscriber.EffectCount;
public override void _EnterTree()
{
Bus = EventBus.CreateBus(Key, new ShrinkBusOptions
{
Scheduler = ShrinkBusSchedulerKind.MainThread,
DispatchMode = ShrinkDispatchMode.Ordered,
QueueCapacity = 32
});
_binding = EventBus.Attach(_subscriber, Key);
}
public void Restore(bool fail)
{
Post(new DemoEffect());
if (fail) throw new InvalidOperationException("Candidate restore failed.");
}
public void Commit()
{
_restoring = false;
Post(new DemoWorldReady());
}
private void Post<T>(T value) where T : IShrinkEvent
{
if (!_restoring) Bus.Post(value);
}
public override void _ExitTree()
{
_binding?.Dispose();
_binding = null;
EventBus.RemoveBus(Key);
}
}
public readonly struct DemoWorldReady : IShrinkEvent { }
public readonly struct DemoEffect : IShrinkEvent { }
[ShrinkEventSubscriber]
public sealed class DemoWorldSubscriber
{
public int ReadyCount { get; private set; }
public int EffectCount { get; private set; }
[ShrinkSubscribe] private void OnReady(DemoWorldReady value) => ReadyCount++;
[ShrinkSubscribe] private void OnEffect(DemoEffect value) => EffectCount++;
}