Unity消息中心

  • Post author:
  • Post category:其他




消息中心

复制代码
public class EventManager : Singleton<EventManager>
{
    /**
     * 存储所有的消息
     * 消息类型作key 委托类做值
     */
    private Dictionary<TypeEvent, DelegateEvent> pool = new Dictionary<TypeEvent, DelegateEvent>();
    /// <summary>
    /// 注册消息方法
    /// </summary>
    /// <param name="type">消息类型</param>
    /// <param name="handle">封装成委托的方法</param>
    public void AddListener(TypeEvent type,DelegateEvent.Handle handle)
    {
        DelegateEvent temp;
        if (pool.ContainsKey(type))//判断字典中是否有type类型的键值对
        {
            temp = pool[type];
        }
        else
        {
            temp = new DelegateEvent();//没有则新建一个添加进去
            pool[type] = temp;
        }
            temp.AddListener(handle);//将handle注册到委托类中
    }
    /// <summary>
    /// 注销消息方法
    /// </summary>
    /// <param name="type">消息类型</param>
    /// <param name="handle">需要注销的方法</param>
    public void RemoveListener(TypeEvent type, DelegateEvent.Handle handle)
    {
        if (pool.ContainsKey(type))
        {
            pool[type].RemoveListener(handle);
        }
    }
    /// <summary>
    /// 发行消息的方法
    /// </summary>
    /// <param name="type">消息类型</param>
    /// <param name="data">方法执行时所需要的数据</param>
    public void Send(TypeEvent type,object data)
    {
        if (!pool.ContainsKey(type))//判断如果没有对应的消息类型则直接返回
            return;
        EventData eventdata = new EventData();//数据类对象,将消息类型和传输的数据向上封装一层 
        eventdata.type = type;
        eventdata.data = data;
        pool[type].Send(eventdata);//执行所有回调方法
        
    }
}
/// <summary>
/// 数据类存储了消息类型和发送的数据
/// 为了满足数据类型的多样性,对数据向上转型用object存储
/// 在回调方法中只需要将数据向下转型
/// 这么做的好处是可以传输任何类型的数据包括null
/// 还可以根据发送的消息类型做一个switc判断调用不同的函数
/// </summary>
public class EventData
{
    public TypeEvent type;
    public object data;
}
/// <summary>
/// 消息类型枚举,根据实际项目添加
/// </summary>
public enum TypeEvent
{

}
/// <summary>
/// 委托类
/// 将委托进行封装
/// 包含注册,注销,调用方法
/// </summary>
public class DelegateEvent
{
    /**
     * 自定义委托类型
     * 参数使用数据类,此类可以满足任何类型的数据传输
     */
    public delegate void Handle(EventData data);
    public event Handle Handler;//委托实例
    /// <summary>
    /// 注册方法
    /// </summary>
    /// <param name="handle"></param>
    public void AddListener(Handle handle)
    {
        if (handle != null)
        {
            Handler += handle;
        }
    }
    /// <summary>
    /// 注销方法
    /// </summary>
    /// <param name="handle"></param>
    public void RemoveListener(Handle handle)
    {
        if (handle != null)
        {
            Handler -= handle;
        }
    }
    /// <summary>
    /// 执行方法
    /// </summary>
    /// <param name="data">执行回调方法所需要的数据</param>
    public void Send(EventData data)
    {
        Handler?.Invoke(data);
    }
}



版权声明:本文为Over_The_Clouds原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。