在使用Unity进行开发的过程中,我们总需要响应各种事件,有时一个事件的触发需要我们同时进行几项处理。举个例子:在inputfield中输入的文字要做多个Text上显示,这时候就用到了事件管理了。
1,创建一个事件参数接口
Id为事件的唯一标示,生成后就不能改变
public interface IEventArgs
{
/// <summary>
/// 事件Id。
/// </summary>
int Id { get; }
}
2 、创建事件模型
包含事件的发起者,传递的参数
/// <summary> /// 事件模型 /// </summary> internal class EventMode { private readonly object sender; private readonly IEventArgs eventArgs; public EventMode(object sender, IEventArgs args) { this.sender = sender; this.eventArgs = args; } public object Sender { get { return sender; } } public IEventArgs EventArgs { get { return eventArgs; } } }
3,事件管理类
public class EventManager { private readonly Dictionary<int, LinkedList<EventHandler<IEventArgs>>> eventHandlers; private readonly Queue<EventMode> events; public EventManager() { eventHandlers = new Dictionary<int, LinkedList<EventHandler<IEventArgs>>>(); events = new Queue<EventMode>(); //创建定时更新任务 var updateAgent = FactoryManager.CreatSingtonMonoBehaviour<MonoBehaviourAgent>() as MonoBehaviourAgent; updateAgent.UpdateAgentEvent += Update; } private void Update() { lock (events) { while (events.Count > 0) { var e = events.Dequeue(); HandleEvent(e.Sender, e.EventArgs); } } } /// <summary> /// 清理事件 /// </summary> public void Shutdown() { lock (events) { events.Clear(); } eventHandlers.Clear(); } /// <summary> /// 注册事件 /// </summary> /// <param name="id">事件id</param> /// <param name="handler">事件处理函数</param> public void Subscribe(int id, EventHandler<IEventArgs> handler) { if (null != handler) { LinkedList<EventHandler<IEventArgs>> handlers = null; if (!eventHandlers.TryGetValue(id, out handlers)) { handlers = new LinkedList<EventHandler<IEventArgs>>(); handlers.AddLast(handler); eventHandlers.Add(id, handlers); } else { handlers.AddLast(handler); } } } /// <summary> /// 取消注册事件 /// </summary> /// <param name="id">事件id</param> /// <param name="handler">事件处理函数</param> public void Unsubscribe(int id, EventHandler<IEventArgs> handler) { if (null != handler) { LinkedList<EventHandler<IEventArgs>> handlers = null; if (eventHandlers.TryGetValue(id, out handlers)) { handlers.Remove(handler); } } } /// <summary> ///返回主线程触发执行 /// </summary> /// <param name="sender">事件发起者</param> /// <param name="e">参数</param> public void FireOnMainThread(object sender, IEventArgs e) { EventMode eventNode = new EventMode(sender, e); lock (events) { events.Enqueue(eventNode); } } /// <summary> /// 立即触发执行 /// </summary> /// <param name="sender">事件发起者</param> /// <param name="e">参数</param> public void Fire (object sender, IEventArgs e) { HandleEvent(sender, e); } /// <summary> /// 具体执行函数 /// </summary> /// <param name="sender"></param> /// <param name="args"></param> private void HandleCore(object sender, IEventArgs args) { int eventId = args.Id; LinkedList<EventHandler<IEventArgs>> handlers = null; if (eventHandlers.TryGetValue(eventId, out handlers) && handlers.Count > 0) { LinkedListNode<EventHandler<IEventArgs>> current = handlers.First; while (current != null) { LinkedListNode<EventHandler<IEventArgs>> next = current.Next; current.Value(sender, args); current = next; } }
FactoryManager.ClearEventReference(args); } }