在Unity中 用C#实现自定义的事件系统用法:EventUtil.AddListener(“事件名称”, 回调方法) // 添加事件监听器EventUtil.RemoveListener(“事件名称”, 回调方法) // 移除事件监听器EventUtil.DispatchEvent(“事件名称”, 不定长参数…) // 派发事件实现效果:事件工具EventUtil.csnamespace Pers.ZY.Events { /// <summary> /// 事件工具 /// <para>ZhangYu 2019-03-04</para> /// </summary> public static class EventUtil { /// <summary> 事件派发器 </summary> private static EventDispatcher dispatcher = new EventDispatcher(); /// <summary> 添加事件监听器 </summary> /// <param name=“eventType”>事件类型</param> /// <param name=“eventHandler”>事件处理器</param> public static void AddListener(string eventType, EventListener.EventHandler eventHandler) { dispatcher.AddListener(eventType, eventHandler); } /// <summary> 移除事件监听器 </summary> /// <param name=“eventType”>事件类型</param> /// <param name=“eventHandler”>事件处理器</param> public static void RemoveListener(string eventType, EventListener.EventHandler eventHandler) { dispatcher.RemoveListener(eventType, eventHandler); } /// <summary> 是否已经拥有该类型的事件 </summary> /// <param name=“eventType”>事件类型</param> public static bool HasListener(string eventType) { return dispatcher.HasListener(eventType); } /// <summary> 派发事件 </summary> /// <param name=“eventType”>事件类型</param> public static void DispatchEvent(string eventType, params object[] args) { dispatcher.DispatchEvent(eventType, args); } /// <summary> 清理所有事件监听器 </summary> public static void Clear() { dispatcher.Clear(); } }}事件派发器EventDispatcher.csusing System.Collections.Generic;namespace Pers.ZY.Events { /// <summary> /// 事件派发器 /// <para>ZhangYu 2019-03-05</para> /// </summary> public class EventDispatcher { /// <summary> 事件Map </summary> private Dictionary<string, EventListener> dic = new Dictionary<string, EventListener>(); /// <summary> 添加事件监听器 </summary> /// <param name=“eventType”>事件类型</param> /// <param name=“eventHandler”>事件处理器</param> public void AddListener(string eventType, EventListener.EventHandler eventHandler) { EventListener invoker; if (!dic.TryGetValue(eventType, out invoker)) { invoker = new EventListener(); dic.Add(eventType, invoker); } invoker.eventHandler += eventHandler; } /// <summary> 移除事件监听器 </summary> /// <param name=“eventType”>事件类型</param> /// <param name=“eventHandler”>事件处理器</param> public void RemoveListener(string eventType, EventListener.EventHandler eventHandler) { EventListener invoker; if (dic.TryGetValue(eventType, out invoker)) invoker.eventHandler -= eventHandler; } /// <summary> 是否已经拥有该类型的事件 </summary> /// <param name=“eventType”>事件类型</param> public bool HasListener(string eventType) { return dic.ContainsKey(eventType); } /// <summary> 派发事件 </summary> /// <param name=“eventType”>事件类型</param> public void DispatchEvent(string eventType, params object[] args) { EventListener invoker; if (dic.TryGetValue(eventType, out invoker)) { EventArgs evt; if (args == null || args.Length == 0) { evt = new EventArgs(eventType); } else { evt = new EventArgs(eventType, args); } invoker.Invoke(evt); } } /// <summary> 清理所有事件监听器 </summary> public void Clear() { foreach (EventListener value in dic.Values) { value.Clear(); } dic.Clear(); } }}事件监听器EventListener.csnamespace Pers.ZY.Events { /// <summary> /// 事件监听器 /// <para>ZhangYu 2019-03-05</para> /// </summary> public class EventListener { /// <summary> 事件处理器委托 </summary> public delegate void EventHandler(EventArgs eventArgs); /// <summary> 事件处理器集合 </summary> public EventHandler eventHandler; /// <summary> 调用所有添加的事件 </summary> public void Invoke(EventArgs eventArgs) { if (eventHandler != null) eventHandler.Invoke(eventArgs); } /// <summary> 清理所有事件委托 </summary> public void Clear() { eventHandler = null; } }}事件数据EventArgs.csnamespace Pers.ZY.Events { /// <summary> 事件参数 /// <para>ZhangYu 2019-03-05</para> /// </summary> public class EventArgs { /// <summary> 事件类型 </summary> public readonly string type; /// <summary> 事件参数 </summary> public readonly object[] args; public EventArgs(string type) { this.type = type; } public EventArgs(string type, params object[] args) { this.type = type; this.args = args; } }}事件派发测试using UnityEngine;using Pers.ZY.Events;/// <summary> 派发事件测试 </summary>public class EventDispatchTest : MonoBehaviour { public void Call() { EventUtil.DispatchEvent(EventHandleTest.ON_CLICK); EventUtil.DispatchEvent(EventHandleTest.ON_CLICK2, “参数1”); } }事件接收测试using UnityEngine;using Pers.ZY.Events;/// <summary> 处理事件测试 </summary>public class EventHandleTest : MonoBehaviour { // 定义事件名称 public const string ON_CLICK = “ON_CLICK”; // 定义事件名称 public const string ON_CLICK2 = “ON_CLICK2”; private void Start () { // 添加监听器 if (!EventUtil.HasListener(ON_CLICK)) EventUtil.AddListener(ON_CLICK, OnClick); if (!EventUtil.HasListener(ON_CLICK2)) EventUtil.AddListener(ON_CLICK2, OnClick2); } // 处理点击事件 public void OnClick(EventArgs evt) { print(evt.type); print(evt.args); } // 带参数的点击事件 public void OnClick2(EventArgs evt) { print(evt.type); print(evt.args[0]); } // 移除监听器 private void OnDestroy() { EventUtil.RemoveListener(ON_CLICK, OnClick); EventUtil.RemoveListener(ON_CLICK2, OnClick2); }}