using System; using System.Collections.Generic; using UnityEngine; namespace Stary.Evo { public class EnumEventSystem { public static readonly EnumEventSystem Global = new EnumEventSystem(); private readonly Dictionary mEvents = new Dictionary(50); public EnumEventSystem(){} #region 功能函数 public IUnRegister Register(T key, Action onEvent)where T : IConvertible { var kv =$"{key.ToString()}"; if (mEvents.TryGetValue(kv, out var e)) { var easyEvent = e.As(); return easyEvent.Register(onEvent); } else { var easyEvent = new EasyEvent(); mEvents.Add(kv,easyEvent); return easyEvent.Register(onEvent); } } public IUnRegister Register(T key, Action onEvent)where T : IConvertible { var kv =$"{key.ToString()}_{typeof(T1).Name}"; if (mEvents.TryGetValue(kv, out var e)) { var easyEvent = e.As>(); return easyEvent.Register(onEvent); } else { var easyEvent = new EasyEvent(); mEvents.Add(kv,easyEvent); return easyEvent.Register(onEvent); } } public IUnRegister Register(T key, Action onEvent)where T : IConvertible { var kv =$"{key.ToString()}_{typeof(T1).Name}_{typeof(T2).Name}"; if (mEvents.TryGetValue(kv, out var e)) { var easyEvent = e.As>(); return easyEvent.Register(onEvent); } else { var easyEvent = new EasyEvent(); mEvents.Add(kv,easyEvent); return easyEvent.Register(onEvent); } } public IUnRegister Register(T key, Action onEvent) where T : IConvertible { var kv =$"{key.ToString()}_{typeof(T1).Name}_{typeof(T2).Name}_{typeof(T3).Name}"; if (mEvents.TryGetValue(kv, out var e)) { var easyEvent = e.As>(); return easyEvent.Register(onEvent); } else { var easyEvent = new EasyEvent(); mEvents.Add(kv, easyEvent); return easyEvent.Register(onEvent); } } public IUnRegister Register(T key, Action onEvent) where T : IConvertible { var kv =$"{key.ToString()}_objects"; if (mEvents.TryGetValue(kv, out var e)) { var easyEvent = e.As>(); return easyEvent.Register(onEvent); } else { var easyEvent = new EasyEvent(); mEvents.Add(kv, easyEvent); return easyEvent.Register(onEvent); } } public void UnRegister(T key, Action onEvent) where T : IConvertible { var kv = key.ToString(); if (mEvents.TryGetValue(kv, out var e)) { e.As()?.UnRegister(onEvent); } } public void UnRegister(T key, Action onEvent) where T : IConvertible { var kv =$"{key.ToString()}_{typeof(T1).Name}"; if (mEvents.TryGetValue(kv, out var e)) { e.As>()?.UnRegister(onEvent); } } public void UnRegister(T key, Action onEvent) where T : IConvertible { var kv =$"{key.ToString()}_{typeof(T1).Name}_{typeof(T2).Name}"; if (mEvents.TryGetValue(kv, out var e)) { e.As>()?.UnRegister(onEvent); } } public void UnRegister(T key, Action onEvent) where T : IConvertible { var kv =$"{key.ToString()}_{typeof(T1).Name}_{typeof(T2).Name}_{typeof(T3).Name}"; if (mEvents.TryGetValue(kv, out var e)) { e.As>()?.UnRegister(onEvent); } } public void UnRegister(T key, Action onEvent) where T : IConvertible { var kv =$"{key.ToString()}_objects"; if (mEvents.TryGetValue(kv, out var e)) { e.As>()?.UnRegister(onEvent); } } public void UnRegisterAll() { mEvents.Clear(); } public void Send(T key) where T : IConvertible { var kv = key.ToString(); if (mEvents.TryGetValue(kv, out var e)) { e.As().Trigger(); } else { Debug.LogError($"UnityEvo没有找到对应的事件:{kv}"); } } public void Send(T key, T1 t1) where T : IConvertible { var kv =$"{key.ToString()}_{typeof(T1).Name}"; if (mEvents.TryGetValue(kv, out var e)) { e.As>().Trigger(t1); } else { Debug.LogError($"UnityEvo没有找到对应的事件:{kv}"); } } public void Send(T key, T1 t1,T2 t2) where T : IConvertible { var kv =$"{key.ToString()}_{typeof(T1).Name}_{typeof(T2).Name}"; if (mEvents.TryGetValue(kv, out var e)) { e.As>().Trigger(t1,t2); } else { Debug.LogError($"UnityEvo没有找到对应的事件:{kv}"); } } public void Send(T key, T1 t1,T2 t2 ,T3 t3) where T : IConvertible { var kv =$"{key.ToString()}_{typeof(T1).Name}_{typeof(T2).Name}_{typeof(T3).Name}"; if (mEvents.TryGetValue(kv, out var e)) { e.As>().Trigger(t1,t2,t3); } else { Debug.LogError($"UnityEvo没有找到对应的事件:{kv}"); } } public void Send(T key, params object[] args) where T : IConvertible { var kv =$"{key.ToString()}_objects"; if (mEvents.TryGetValue(kv, out var e)) { e.As>().Trigger(kv,args); } else { Debug.LogError($"UnityEvo没有找到对应的事件:{kv}"); } } #endregion public void Dispose() { mEvents.Clear(); } } }