注:转载请标明原文地址: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; } }