Unity消息中心

消息中心

复制代码
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);
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值