• 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());
        }
    
    阳光穿过叶的缝隙!
  • 相关阅读:
    Java 并发编程解析 | 关于Java领域中的线程机制,我们应该知道的那些事?
    Java 并发编程解析 | 如何正确理解线程机制中常见的I/O模型,各自主要用来解决什么问题?
    Java 并发编程解析 | 关于线程机制的那些事,你究竟了解多少?
    Java 并发编程解析 | 每个Java Developer都应该知道的关于并发编程的那点事?
    identity4 系列————开篇概念[一]
    identity4 系列————持久化配置篇[五]
    mongodb基础整理篇————副本概念篇[外篇]
    c# 异步进阶————channel [一]
    mongodb基础整理篇————副本原理篇[外篇]
    identity4 系列————案例篇[三]
  • 原文地址:https://www.cnblogs.com/Aaron-Han/p/12017711.html
Copyright © 2020-2023  润新知