C#——Unity事件監聽器

事件監聽器

事件類型

public enum BaseHEventType {
    GAME_OVER,
    GAME_WIN,
    PAUSE,
    ENERGY_EMEPTy,
    GAME_DATA
}

事件基類

public class BaseHEvent 
{
    protected Hashtable m_arguments;
    protected BaseHEventType m_type;
    protected Object m_Sender;

    public IDictionary Params {
        get { return this.m_arguments; }
        set { this.m_arguments = (value as Hashtable); }
    }

    public BaseHEventType Type {//事件類型 構造函數會給Type 和Sender賦值
        get { return this.m_type; }
        set { this.m_type = value; }
    }

    public Object Sender {//物體
        get { return this.m_Sender; }
        set { this.m_Sender = value; }
    }

    public override string ToString()
    {
        return this.m_type + "[" + ((this.m_Sender == null) ? "null" : this.m_Sender.ToString()) + "]";
    }

    /// <summary>
    /// 構造函數
    /// </summary>
    /// <param name="type"> 事件類型 </param>
    /// <param name="sender"> 物體 </param>
    public BaseHEvent(BaseHEventType type, Object sender)
    {
        this.Type = type;
        Sender = sender;
        if (this.m_arguments == null)
        {
            this.m_arguments = new Hashtable();
            Debug.LogError("this.m_arguments" + this.m_arguments.Count);
        }
    }

    public BaseHEvent (BaseHEventType type,Hashtable args,Object sender)
    {
        this.Type = type;
        this.m_arguments = args;
        Sender = sender;

        if (this.m_arguments == null)
        {
            this.m_arguments = new Hashtable();
        }
    }

    public BaseHEvent Clone()
    {
        return new BaseHEvent(this.m_type, this.m_arguments, Sender);
    }
}

事件機制

public delegate void HEventListenerDelegate(BaseHEvent hEvent);//定義委託用於傳事件基類

public class HEventDispatcher
{
    static HEventDispatcher Instance;
    public static HEventDispatcher GetInstance()//單利
    {
        if (Instance == null)
        {
            Instance = new HEventDispatcher();
        }
        return Instance;
    }

    private Hashtable listeners = new Hashtable(); //掌控全部類型的委託事件

    public void AddEventListener(BaseHEventType type,HEventListenerDelegate listener)
    {
        HEventListenerDelegate hEventListenerDelegate = this.listeners[type] as HEventListenerDelegate;//得到以前這個類型的委託 若是第一次等於Null 
        hEventListenerDelegate = (HEventListenerDelegate) Delegate.Combine(hEventListenerDelegate, listener);//將兩個委託的調用列表鏈接在一塊兒,成爲一個新的委託
        this.listeners[type] = hEventListenerDelegate;//賦值給哈希表中的這個類型
    }

    public void RemoveEventListener(BaseHEventType type, HEventListenerDelegate listener)
    {
        HEventListenerDelegate hEventListener = this.listeners[type] as HEventListenerDelegate;//得到以前這個類型的委託 若是第一次等於Null
        if (hEventListener != null)
        {
            hEventListener =(HEventListenerDelegate)Delegate.Remove(hEventListener, listener);//從hEventListener的調用列表中移除listener
            this.listeners[type] = hEventListener;//賦值給哈希表中的這個類型
        }
    }

    public void DispatchEvent(BaseHEvent baseH)
    {
        HEventListenerDelegate hEventListener = this.listeners[baseH.Type] as HEventListenerDelegate;
        if (hEventListener != null)
        {
            try
            {
                hEventListener(baseH);//執行委託
            }
            catch (Exception e)
            {
                throw new System.Exception(string.Concat(new string[] { "Error Dispatch event", baseH.Type.ToString(), ":", e.Message, " ", e.StackTrace }), e);
            }
        }
    }

    public void RemoveAll()
    {
        this.listeners.Clear();
    }

}

調用方法 下面是我在Unity當中調用的

//註冊/添加事件
    void Start()
    {
        HEventDispatcher.GetInstance().AddEventListener(BaseHEventType.GAME_DATA,StartHEvent);
        HEventDispatcher.GetInstance().AddEventListener(BaseHEventType.GAME_DATA, StartDataEvent);
        HEventDispatcher.GetInstance().AddEventListener(BaseHEventType.GAME_WIN,StopHEvent);
    }
    
    //事件分發
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            HEventDispatcher.GetInstance().DispatchEvent(new BaseHEvent(BaseHEventType.GAME_DATA, this));
        }
        if (Input.GetKeyDown(KeyCode.S))
        {
            HEventDispatcher.GetInstance().DispatchEvent(new BaseHEvent(BaseHEventType.GAME_WIN, this));
        }
    }
    //事件移除
    private void OnDestroy()
    {
        HEventDispatcher.GetInstance().RemoveEventListener(BaseHEventType.GAME_DATA, StartHEvent);
        HEventDispatcher.GetInstance().RemoveEventListener(BaseHEventType.GAME_WIN, StopHEvent);
    }



    //添加事件方法
    void StartDataEvent(BaseHEvent hEvent)
    {
        Debug.Log("Doule" +hEvent.ToString());
    }

    void StartHEvent(BaseHEvent hEvent)
    {
        Debug.Log("StartHEvent + HEvent" + hEvent.ToString());
    }

    void StopHEvent(BaseHEvent hEvent)
    {
        Debug.Log("StopHEvent + HEvent" + hEvent.ToString());
    }
相關文章
相關標籤/搜索