美文网首页Unity
2020-10-23 Unity事件系统设计

2020-10-23 Unity事件系统设计

作者: VECTOR_Y | 来源:发表于2020-10-23 11:40 被阅读0次

    我们项目框架设计中事件系统是必不可少的,便于我们各个模块之间方便通讯,这大大的降低了我们的耦合度,也增加了代码的可读性,下面贴上代码

    /// <summary>
    /// 事件基类,所有需要接收事件的脚本都需要继承此类,复写HandleEvent方法即可
    /// </summary>
    public class EventHandler
    {
          
        public delegate void _HandleEvent(EventDef ev, params object[] le);
    
        private _HandleEvent mhandler = null;
    
      
        public void RegisterEvent(EventDef ev)
        {
            EventMgrHelper.Ins.RegisterEventHandler(ev, this);
        }
    
        public void UnRegisterEvent(EventDef ev)
        {
            EventMgrHelper.Ins.UnRegisterEventHandler(ev, this);
        }
    
        public virtual void HandleEvent(EventDef ev, params object[] le)
        {
            mhandler?.Invoke(ev, le);
        }
    
        public _HandleEvent Handler
        {
            set { mhandler = value; }
        }
    }
    
    
    using System.Collections.Generic;
    
        /// <summary>
        /// 事件分发管理 需单例
        /// </summary>
        public class EventMgrHelper : SingletonObject<EventMgrHelper>
        {
            private Dictionary<EventDef, List<EventHandler>> mDicHandler = new Dictionary<EventDef, List<EventHandler>>();
    
            /// <summary>
            /// 注册事件
            /// </summary>
            public void RegisterEventHandler(EventDef ed, EventHandler handler)
            {
                List<EventHandler> lh;
                if (mDicHandler.TryGetValue(ed, out lh))
                {
                    lh.Add(handler);
                }
                else
                {
                    lh = new List<EventHandler>();
                    lh.Add(handler);
                    mDicHandler.Add(ed, lh);
                }
            }
    
            /// <summary>
            /// 解绑事件
            /// </summary>
            public void UnRegisterEventHandler(EventDef ed, EventHandler handler)
            {
                List<EventHandler> lh;
                if (mDicHandler.TryGetValue(ed, out lh))
                {
                    for (int i = 0; i < lh.Count; ++i)
                    {
                        if (lh[i] == handler)
                        {
                            lh.RemoveAt(i);
                            return;
                        }
                    }
                }
            }
    
            
            /// <summary>
            /// 发送事件 
            /// </summary>
            /// <param name="ed"></param>
            /// <param name="le"></param>
            public void PushEvent(EventDef ed, params object[] le)
            {
                List<EventHandler> lh;
                if (!mDicHandler.TryGetValue(ed, out lh))
                {
                    string logText = "event = " + ed.ToString() + " not find Handler";
                    UnityEngine.Debug.Log(logText);
                    return;
                }
    
                for (int j = 0; j < lh.Count; ++j)
                {
                    try
                    {
                        lh[j].HandleEvent(ed, le);
                    }
                    catch (System.Exception e)
                    {
                        UnityEngine.Debug.Log(ed + " " + e.Message);
                    }
                }
            }
    }
    
    /// <summary>
    /// 事件key  通过此key实现分发,也可以通过此key的引用,实现代码的易读性
    /// </summary>
    public enum EventDef
    {
        NONE = 0,
    
        Callback,
    
        Max,//在这前面加
    }
    
    

    以下为使用

    public class GameController : EventHandler {
    
        public GameController()
        {
            //注册事件
            RegisterEvent(EventDef.Callback);
        }
    
        /// <summary>
        /// 实现事件接收方法
        /// </summary>
        /// <param name="ev"></param>
        /// <param name="le"></param>
        public override void HandleEvent(EventDef ev, params object[] le)
        {
            base.HandleEvent(ev, le);
    
            if (ev == EventDef.Callback) 
            {
                Debug.Log("callback+:"+le[0].ToString());
            }
        }
    
    }
    

    //发送方式

    private void Awake()
    {
            GameController gam = new GameController();
            EventMgrHelper.Ins.PushEvent(EventDef.Callback, "asdfadsfasdfasf");
    }
    

    相关文章

      网友评论

        本文标题:2020-10-23 Unity事件系统设计

        本文链接:https://www.haomeiwen.com/subject/grqvmktx.html