Unity C# 自定义事件系统

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

}
相关文章
相关标签/搜索