事件管理器(后续会不断完善)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public delegate void EventCallBack(params object[] args);
public class Single<T> : MonoBehaviour where T : Single<T>
{
protected static T _instance;
public static T Ins
{
get
{
return _instance;
}
}
protected virtual void Awake()
{
_instance = (T)this;
}
protected virtual void OnDestroy()
{
if (_instance == this)
{
_instance = null;
}
}
}
public class EventModule : Single<EventModule>
{
public Dictionary<ClientEvent, EventListener> _dic;
public void Register(ClientEvent clientEvent, EventCallBack eventCallBack)
{
if (_dic == null)
{
_dic = new Dictionary<ClientEvent, EventListener>();
}
EventListener listener = null;
if (!_dic.TryGetValue(clientEvent, out listener))
{
listener = new EventListener(eventCallBack);
_dic.Add(clientEvent, listener);
}
else
{
listener.Add(eventCallBack);
}
}
public void Remove(ClientEvent clientEvent, EventCallBack eventCallBack)
{
EventListener listener;
if (_dic.TryGetValue(clientEvent, out listener))
{
listener.Remove(eventCallBack);
}
}
public void Trigger(ClientEvent clientEvent, params object[] args)
{
EventListener listener;
if (_dic.TryGetValue(clientEvent, out listener))
{
listener.Trigger(args);
}
}
public void RemoveAll(ClientEvent clientEvent)
{
_dic?.Remove(clientEvent);
}
public void RemoveAll()
{
_dic.Clear();
}
}
public class ClientEvent
{
public void Register(EventCallBack callBack)
{
EventModule.Ins.Register(this, callBack);
}
public void Remove(EventCallBack callBack)
{
EventModule.Ins.Remove(this, callBack);
}
public void Trigger(params object[] args)
{
EventModule.Ins.Trigger(this, args);
}
public void RemoveAll()
{
EventModule.Ins?.RemoveAll(this);
}
}
public class EventListener
{
public EventCallBack eventCallBack;
public EventListener(EventCallBack callBack)
{
this.eventCallBack = callBack;
}
public void Add(EventCallBack callBack)
{
eventCallBack += callBack;
}
public void Remove(EventCallBack callBack)
{
eventCallBack -= callBack;
}
public void Trigger(params object[] args)
{
eventCallBack(args);
}
}