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

}
相關文章
相關標籤/搜索