unity客户端框架 消息系统

消息系统包括   记录

一个通用的事件监听器

注册与解绑事件监听器

广播消息

 

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},活动有变化!!");
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值