Unity事件的监听与广播

通过事件来传递消息,降低代码的耦合度。

每一个事件码对应一种事件,通过广播事件码,来触发相应的事件

事件码通过枚举列举:

public enum EventType
{
    ShowText,
    //.......
}

自定义封装含不同参数的委托

//携带不同参数个数的委托(系统自带的Action 只有四个参数)
public delegate void CallBack();
public delegate void CallBack<T>(T arg);
public delegate void CallBack<T, X>(T arg1, X arg2);
public delegate void CallBack<T, X, Y>(T arg1, X arg2, Y arg3);
public delegate void CallBack<T, X, Y, Z>(T arg1, X arg2, Y arg3, Z arg4);
public delegate void CallBack<T, X, Y, Z, W>(T arg1, X arg2, Y arg3, Z arg4, W arg5);

消息中心:

/// <summary>
/// 事件中心
/// </summary>
public class EventCenter
{
    //存放各种事件的字典
    private static Dictionary<EventType, Delegate> m_EventTable = new Dictionary<EventType, Delegate>();

    //精简代码
    #region 精简
    private static void OnListenerAdding(EventType eventType, Delegate callback)
    {
        if (!m_EventTable.ContainsKey(eventType))
        {
            m_EventTable.Add(eventType, null);
        }
        Delegate del = m_EventTable[eventType];
        //判断该事件码对应的事件类型(参数)是否一样
        if (del != null && del.GetType() != callback.GetType())
        {
            throw new Exception(string.Format("尝试添加事件失败"));
        }
    }

    private static void OnListenerRemoving(EventType eventType, Delegate callback)
    {
        if (m_EventTable.ContainsKey(eventType))
        {
            Delegate del = m_EventTable[eventType];
            if (del == null)
            {
                throw new Exception(string.Format("移除失败,对应事件为空"));
            }
            else if (del.GetType() != callback.GetType())
            {
                throw new Exception(string.Format("移除失败,对应事件不同"));
            }
        }
        else
        {
            throw new Exception(string.Format("移除失败,事件码为空"));
        }
    }

    private static void OnListenerRemoved(EventType eventType)
    {
        if (m_EventTable[eventType] == null)
        {
            m_EventTable.Remove(eventType);
        }
    }

    #endregion

    #region NoParamter
    //添加事件
    public static void AddListener(EventType eventType, CallBack callback)
    {
        OnListenerAdding(eventType, callback);
        m_EventTable[eventType] = (CallBack)m_EventTable[eventType] + callback;
    }

    //移除事件
    public static void RemoveListener(EventType eventType, CallBack callback)
    {
        OnListenerRemoving(eventType, callback);
        m_EventTable[eventType] = (CallBack)m_EventTable[eventType] - callback;
        OnListenerRemoved(eventType);
    }

    //事件的广播
    public static void BroadCast(EventType eventType)
    {
        Delegate del;
        if (m_EventTable.TryGetValue(eventType, out del))
        {
            CallBack callback = del as CallBack;
            if (callback != null)
            {
                callback();
            }
            else
            {
                throw new Exception(string.Format("广播事件错误,对应事件为空"));
            }
        }

    }
    #endregion

    #region One Paramter

    //添加事件
    public static void AddListener<T>(EventType eventType, CallBack<T> callback)
    {
        OnListenerAdding(eventType, callback);
        m_EventTable[eventType] = (CallBack<T>)m_EventTable[eventType] + callback;
    }

    //移除事件
    public static void RemoveListener<T>(EventType eventType, CallBack<T> callback)
    {
        OnListenerRemoving(eventType, callback);
        m_EventTable[eventType] = (CallBack<T>)m_EventTable[eventType] - callback;
        OnListenerRemoved(eventType);

    }

    //事件的广播
    public static void BroadCast<T>(EventType eventType,T arg)
    {
        Delegate del;
        if (m_EventTable.TryGetValue(eventType, out del))
        {
            CallBack<T> callback = del as CallBack<T>;
            if (callback != null)
            {
                callback(arg);
            }
            else
            {
                throw new Exception(string.Format("广播事件错误,对应事件为空"));
            }
        }

    }
    #endregion

    #region Two Paramters
    //添加事件
    public static void AddListener<T,X>(EventType eventType, CallBack<T,X> callback)
    {
        OnListenerAdding(eventType, callback);
        m_EventTable[eventType] = (CallBack<T,X>)m_EventTable[eventType] + callback;
    }

    //移除事件
    public static void RemoveListener<T,X>(EventType eventType, CallBack<T,X> callback)
    {
        OnListenerRemoving(eventType, callback);
        m_EventTable[eventType] = (CallBack<T,X>)m_EventTable[eventType] - callback;
        OnListenerRemoved(eventType);

    }

    //事件的广播
    public static void BroadCast<T,X>(EventType eventType, T arg1,X arg2)
    {
        Delegate del;
        if (m_EventTable.TryGetValue(eventType, out del))
        {
            CallBack<T,X> callback = del as CallBack<T,X>;
            if (callback != null)
            {
                callback(arg1,arg2);
            }
            else
            {
                throw new Exception(string.Format("广播事件错误,对应事件为空"));
            }
        }

    }
    #endregion

猜你喜欢

转载自blog.csdn.net/hnzmdlhc/article/details/89033423