我们项目框架设计中事件系统是必不可少的,便于我们各个模块之间方便通讯,这大大的降低了我们的耦合度,也增加了代码的可读性,下面贴上代码
/// <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");
}
网友评论