美文网首页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