注:轉載請標明原文地址:https://segmentfault.com/a/11...segmentfault
在Unity中 用C#實現自定義的事件系統
用法:工具
EventUtil.Add("事件類型", 回調方法) // 添加事件監聽器 EventUtil.Remove("事件類型", 回調方法) // 移除事件監聽器 EventUtil.Send("事件類型", 不定長參數...) // 發送事件
事件發送測試測試
using UnityEngine; /// <summary> 事件發送測試 </summary> public class EventSendTest : MonoBehaviour { public void Send() { EventUtil.Send(EventName.ON_CLICK); EventUtil.Send(EventName.ON_CLICK_ARGS, "參數1"); } }
事件接收測試this
using UnityEngine; /// <summary> 事件處理測試 </summary> public class EventHandleTest : MonoBehaviour { private void Start () { // 添加監聽器 if (!EventUtil.Has(EventName.ON_CLICK)) EventUtil.Add(EventName.ON_CLICK, OnClick); if (!EventUtil.Has(EventName.ON_CLICK_ARGS)) EventUtil.Add(EventName.ON_CLICK_ARGS, OnClickArgs); } // 處理點擊事件 public void OnClick(EventArgs evt) { print(evt.type); print(evt.args); } // 帶參數的點擊事件 public void OnClickArgs(EventArgs evt) { print(evt.type); print(evt.args[0]); } // 移除監聽器 private void OnDestroy() { EventUtil.Remove(EventName.ON_CLICK, OnClick); EventUtil.Remove(EventName.ON_CLICK_ARGS, OnClickArgs); } }
事件名稱
EventName.csspa
/// <summary> /// 事件名稱 /// <param>ZhangYu 2019-03-27</param> /// </summary> public static class EventName { public const string ON_CLICK = "ON_CLICK"; public const string ON_CLICK_ARGS = "ON_CLICK_ARGS"; }
實現效果:code
事件工具
EventUtil.cs事件
/// <summary> /// 事件工具 /// <para>ZhangYu 2019-03-04</para> /// </summary> public static class EventUtil { /// <summary> 事件發送器 </summary> private static EventSender sender = new EventSender(); /// <summary> 添加事件監聽器 </summary> /// <param name="eventType">事件類型</param> /// <param name="eventHandler">事件處理器</param> public static void Add(string eventType, EventHandler<EventArgs> eventHandler) { sender.Add(eventType, eventHandler); } /// <summary> 移除事件監聽器 </summary> /// <param name="eventType">事件類型</param> /// <param name="eventHandler">事件處理器</param> public static void Remove(string eventType, EventHandler<EventArgs> eventHandler) { sender.Remove(eventType, eventHandler); } /// <summary> 是否已經擁有該類型的事件 </summary> /// <param name="eventType">事件類型</param> public static bool Has(string eventType) { return sender.Has(eventType); } /// <summary> 發送事件 </summary> /// <param name="eventType">事件類型</param> public static void Send(string eventType, params object[] eventArgs) { sender.Send(eventType, eventArgs); } /// <summary> 清理全部事件監聽器 </summary> public static void Clear() { sender.Clear(); } }
事件發送器
EventSender.csget
using System.Collections.Generic; /// <summary> /// 事件發送器 /// <para>ZhangYu 2019-03-05</para> /// </summary> public class EventSender { /// <summary> 事件Map </summary> private Dictionary<string, EventListener> dic = new Dictionary<string, EventListener>(); /// <summary> 添加事件監聽器 </summary> /// <param name="eventType">事件類型</param> /// <param name="eventHandler">事件處理器</param> public void Add(string eventType, EventHandler<EventArgs> eventHandler) { EventListener invoker; if (!dic.TryGetValue(eventType, out invoker)) { invoker = new EventListener(); dic.Add(eventType, invoker); } invoker.handler += eventHandler; } /// <summary> 移除事件監聽器 </summary> /// <param name="eventType">事件類型</param> /// <param name="eventHandler">事件處理器</param> public void Remove(string eventType, EventHandler<EventArgs> eventHandler) { EventListener invoker; if (dic.TryGetValue(eventType, out invoker)) invoker.handler -= eventHandler; } /// <summary> 是否已經擁有該類型的事件 </summary> /// <param name="eventType">事件名稱</param> public bool Has(string eventType) { return dic.ContainsKey(eventType); } /// <summary> 發送事件 </summary> /// <param name="eventType">事件類型</param> public void Send(string eventType, params object[] eventArgs) { EventListener invoker; if (dic.TryGetValue(eventType, out invoker)) { EventArgs evt = new EventArgs(eventType, eventArgs); invoker.Invoke(evt); } } /// <summary> 清理全部事件監聽器 </summary> public void Clear() { foreach (EventListener value in dic.Values) { value.Clear(); } dic.Clear(); } }
事件監聽器
EventListener.csstring
/// <summary> 事件處理器委託 </summary> public delegate void EventHandler<T>(T args); /// <summary> /// 事件監聽器 /// <para>ZhangYu 2019-03-05</para> /// </summary> public class EventListener { /// <summary> 事件處理器集合 </summary> public EventHandler<EventArgs> handler; /// <summary> 調用全部添加的事件 </summary> public void Invoke(EventArgs args) { if (handler != null) handler.Invoke(args); } /// <summary> 清理全部事件委託 </summary> public void Clear() { handler = null; } }
事件參數
EventArgs.csit
/// <summary> 事件參數 /// <para>ZhangYu 2019-03-05</para> /// </summary> public class EventArgs { /// <summary> 事件類型 </summary> public readonly string type; /// <summary> 事件參數 </summary> public readonly object[] args; /// <param name="type">事件類型 </param> /// <param name="args">事件參數</param> public EventArgs(string type, params object[] args) { this.type = type; this.args = args; } }