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());
    }
posted @   Aaron丶Han  阅读(3274)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示