2020-10-23 Unity事件系統(tǒng)設計

我們項目框架設計中事件系統(tǒng)是必不可少的,便于我們各個模塊之間方便通訊,這大大的降低了我們的耦合度,也增加了代碼的可讀性,下面貼上代碼

/// <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>
    /// 事件分發(fā)管理 需單例
    /// </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>
        /// 發(fā)送事件 
        /// </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實現(xiàn)分發(fā),也可以通過此key的引用,實現(xiàn)代碼的易讀性
/// </summary>
public enum EventDef
{
    NONE = 0,

    Callback,

    Max,//在這前面加
}

以下為使用

public class GameController : EventHandler {

    public GameController()
    {
        //注冊事件
        RegisterEvent(EventDef.Callback);
    }

    /// <summary>
    /// 實現(xiàn)事件接收方法
    /// </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());
        }
    }

}

//發(fā)送方式

private void Awake()
{
        GameController gam = new GameController();
        EventMgrHelper.Ins.PushEvent(EventDef.Callback, "asdfadsfasdfasf");
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容