消息系统包括 记录
一个通用的事件监听器
注册与解绑事件监听器
广播消息
EventPool 是一个事件监听器的对象池,把事件以key-value的形式存入字典,可以添加与移除监听的事件,并可以通知某个事件的发生
public class EventPool<T>where T:EventArgs
{
private Dictionary<int, EventHandler<T>> pool ;
public EventPool()
{
pool = new Dictionary<int, EventHandler<T>>();
}
/// <summary>
/// 检查该委托是否在对象池里面或者是否已经绑定在对象池的委托上
/// </summary>
/// <param name="id"></param>
/// <param name="handler"></param>
/// <returns></returns>
private bool Check(int id,EventHandler<T> handler)
{
EventHandler<T> temp = null;
if(!pool.TryGetValue(id, out temp))
{
return false;
}
if (handler == null) return false;
foreach (var item in temp.GetInvocationList())
{
if(handler==temp)
{
return true;
}
}
return false;
}
/// <summary>
/// 把委托添加到字典池里面 订阅
/// </summary>
/// <param name="id"></param>
/// <param name="handler"></param>
public void Subscribe(int id,EventHandler<T> handler)
{
if(handler==null)
{
throw new Exception("handler is invalid");
}
if(!pool.TryGetValue(id,out EventHandler<T> handlerlist))
{
pool[id] = handler;
}
else
{
if(!Check(id,handler))
{
pool[id] += handler;
}
else
{
Debug.Log($"{handler.ToString()} handler Subscribe duplicate!!");
}
}
}
/// <summary>
/// 取消订阅
/// </summary>
/// <param name="id"></param>
/// <param name="handler"></param>
public void Unsubscribe(int id,EventHandler<T> handler)
{
if (handler == null) throw new Exception("hanlder is null");
if(pool.TryGetValue(id,out EventHandler<T> temp))
{
pool[id] -= handler;
}
}
public void SendMessage(object sender,int id,T e)
{
HandlerEvent(sender, id, e);
}
private void HandlerEvent(object sender,int id,T e)
{
EventHandler<T> handlers = null;
if(pool.TryGetValue(id,out handlers))
{
handlers.Invoke(sender, e);
}
if(handlers==null)
{
throw new Exception("handlers is null");
}
}
}
EventManager是一个单例用来管理EventPool
public class EventManager
{
private static EventManager instance;
public static EventManager Instance
{
get
{
if(instance==null)
{
return instance = new EventManager();
}
return instance;
}
}
private EventPool<GameEventArgs> eventPool;
private EventManager()
{
eventPool = new EventPool<GameEventArgs>();
}
public void Subscribe(int id,EventHandler<GameEventArgs> handler)
{
eventPool.Subscribe(id, handler);
}
public void Unsubscribe(int id ,EventHandler<GameEventArgs> handler)
{
eventPool.Unsubscribe(id, handler);
}
public void SendMessage(object sender,int id, GameEventArgs e=null)
{
eventPool.SendMessage(sender, id, e);
}
}
public abstract class GameEventArgs:EventArgs
{
public abstract int Id
{
get;
}
public abstract void Clear();
}
public enum EventID
{
Login = 0,
OnEnterMainView,
}
添加事件
void Start()
{
EventManager.Instance.Subscribe(1, new System.EventHandler<GameEventArgs>(CallA));//添加事件
EventManager.Instance.SendMessage(this, (int)EventID.Login);触发事件
}
void CallA( object sender,GameEventArgs e)
{
Debug.Log($"调用者:{sender} 参数:{e},活动有变化!!");
}