Repaired hole minigame
This commit is contained in:
73
Assets/ClientSDK/EventDispatcher.cs
Normal file
73
Assets/ClientSDK/EventDispatcher.cs
Normal file
@@ -0,0 +1,73 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
|
||||
namespace GeoSus.Client
|
||||
{
|
||||
// Event dispatcher pro Unity main thread
|
||||
// Unity může přidat SynchronizationContext, nebo polling z Update()
|
||||
public class EventDispatcher
|
||||
{
|
||||
private readonly Queue<Action> _pendingActions = new Queue<Action>();
|
||||
private readonly object _lock = new object();
|
||||
private SynchronizationContext? _syncContext;
|
||||
|
||||
public EventDispatcher()
|
||||
{
|
||||
// Pokusíme se zachytit aktuální synchronization context (Unity main thread)
|
||||
_syncContext = SynchronizationContext.Current;
|
||||
}
|
||||
|
||||
// Volat z networking vlákna - naplánuje callback na main thread
|
||||
public void Post(Action action)
|
||||
{
|
||||
if (_syncContext != null)
|
||||
{
|
||||
_syncContext.Post(_ => action(), null);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Fallback - přidáme do fronty pro polling
|
||||
lock (_lock)
|
||||
{
|
||||
_pendingActions.Enqueue(action);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Volat z Unity Update() pokud není SynchronizationContext
|
||||
public void ProcessPendingActions()
|
||||
{
|
||||
Action[] actions;
|
||||
lock (_lock)
|
||||
{
|
||||
if (_pendingActions.Count == 0) return;
|
||||
actions = _pendingActions.ToArray();
|
||||
_pendingActions.Clear();
|
||||
}
|
||||
|
||||
foreach (var action in actions)
|
||||
{
|
||||
try
|
||||
{
|
||||
action();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"EventDispatcher error: {ex}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public int PendingCount
|
||||
{
|
||||
get
|
||||
{
|
||||
lock (_lock)
|
||||
{
|
||||
return _pendingActions.Count;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user