Unity C# 自定义事件系统

在Unity中 用C#实现自定义的事件系统
用法:

EventUtil.AddListener("事件名称", 回调方法)        // 添加事件监听器
EventUtil.RemoveListener("事件名称", 回调方法)     // 移除事件监听器
EventUtil.DispatchEvent("事件名称", 不定长参数...)   // 派发事件

实现效果:
实现效果

事件工具
EventUtil.cs

namespace 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.cs

using 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.cs

namespace 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.cs

namespace 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);
    }

}