我們項目框架設計中事件系統(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");
}