This commit is contained in:
2025-11-12 07:04:31 +08:00
parent 33a4742904
commit f615d8ddb0
68 changed files with 1388 additions and 1478 deletions

View File

@@ -2,87 +2,90 @@ using System.Collections.Generic;
using System;
using UnityEngine;
public static class EventBus
namespace Tuan.GameFramework
{
private static readonly Dictionary<Type, object> _eventHandlers = new Dictionary<Type, object>();
private static readonly object _lock = new object();
public static void Register<TEvent>(IEventHandler<TEvent> handler) where TEvent : IEvent
public static class EventBus
{
lock (_lock)
{
Type eventType = typeof(TEvent);
if (!_eventHandlers.ContainsKey(eventType))
{
_eventHandlers[eventType] = new List<IEventHandler<TEvent>>();
}
var handlers = _eventHandlers[eventType] as List<IEventHandler<TEvent>>;
if (handler != null && !handlers.Contains(handler))
{
handlers.Add(handler);
}
}
}
private static readonly Dictionary<Type, object> _eventHandlers = new Dictionary<Type, object>();
private static readonly object _lock = new object();
public static void Unregister<TEvent>(IEventHandler<TEvent> handler) where TEvent : IEvent
{
lock (_lock)
public static void Register<TEvent>(IEventHandler<TEvent> handler) where TEvent : IEvent
{
Type eventType = typeof(TEvent);
if (_eventHandlers.ContainsKey(eventType))
lock (_lock)
{
Type eventType = typeof(TEvent);
if (!_eventHandlers.ContainsKey(eventType))
{
_eventHandlers[eventType] = new List<IEventHandler<TEvent>>();
}
var handlers = _eventHandlers[eventType] as List<IEventHandler<TEvent>>;
handlers?.Remove(handler);
if (handlers != null && handlers.Count == 0)
if (handler != null && !handlers.Contains(handler))
{
_eventHandlers.Remove(eventType);
handlers.Add(handler);
}
}
}
}
public static void Publish<TEvent>(TEvent eventData) where TEvent : IEvent
{
List<IEventHandler<TEvent>> handlersToInvoke = null;
lock (_lock)
public static void Unregister<TEvent>(IEventHandler<TEvent> handler) where TEvent : IEvent
{
Type eventType = typeof(TEvent);
if (_eventHandlers.ContainsKey(eventType))
lock (_lock)
{
var handlers = _eventHandlers[eventType] as List<IEventHandler<TEvent>>;
if (handlers != null && handlers.Count > 0)
Type eventType = typeof(TEvent);
if (_eventHandlers.ContainsKey(eventType))
{
handlersToInvoke = new List<IEventHandler<TEvent>>(handlers);
var handlers = _eventHandlers[eventType] as List<IEventHandler<TEvent>>;
handlers?.Remove(handler);
if (handlers != null && handlers.Count == 0)
{
_eventHandlers.Remove(eventType);
}
}
}
}
// 在锁外执行事件处理,避免死锁
if (handlersToInvoke != null)
public static void Publish<TEvent>(TEvent eventData) where TEvent : IEvent
{
foreach (var handler in handlersToInvoke)
List<IEventHandler<TEvent>> handlersToInvoke = null;
lock (_lock)
{
try
Type eventType = typeof(TEvent);
if (_eventHandlers.ContainsKey(eventType))
{
handler?.HandleEvent(eventData);
var handlers = _eventHandlers[eventType] as List<IEventHandler<TEvent>>;
if (handlers != null && handlers.Count > 0)
{
handlersToInvoke = new List<IEventHandler<TEvent>>(handlers);
}
}
catch (Exception e)
}
// 在锁外执行事件处理,避免死锁
if (handlersToInvoke != null)
{
foreach (var handler in handlersToInvoke)
{
Debug.LogError($"Event handling error in {handler.GetType().Name}: {e}");
try
{
handler?.HandleEvent(eventData);
}
catch (Exception e)
{
Debug.LogError($"Event handling error in {handler.GetType().Name}: {e}");
}
}
}
}
}
public static void Clear()
{
lock (_lock)
public static void Clear()
{
_eventHandlers.Clear();
lock (_lock)
{
_eventHandlers.Clear();
}
}
}
}
}

View File

@@ -1,27 +1,30 @@
public interface IEvent { }
public interface IEventHandler<TEvent> where TEvent : IEvent
namespace Tuan.GameFramework
{
void HandleEvent(TEvent eventData);
}
public interface IEvent { }
public struct ApplicationFocusEvent : IEvent
{
public bool HasFocus;
}
public struct SceneLoadEvent : IEvent
{
public string SceneName;
public float Progress;
}
public abstract class EventHandler<TEvent> : IEventHandler<TEvent> where TEvent : IEvent
{
public void HandleEvent(TEvent eventData)
public interface IEventHandler<TEvent> where TEvent : IEvent
{
OnEvent(eventData);
void HandleEvent(TEvent eventData);
}
protected abstract void OnEvent(TEvent eventData);
}
public struct ApplicationFocusEvent : IEvent
{
public bool HasFocus;
}
public struct SceneLoadEvent : IEvent
{
public string SceneName;
public float Progress;
}
public abstract class EventHandler<TEvent> : IEventHandler<TEvent> where TEvent : IEvent
{
public void HandleEvent(TEvent eventData)
{
OnEvent(eventData);
}
protected abstract void OnEvent(TEvent eventData);
}
}