Unity C# 自定义事件系统

10次阅读

共计 4488 个字符,预计需要花费 12 分钟才能阅读完成。

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

}

正文完
 0