Unity 自定义事件 AddListerner

本文详细介绍了如何在Unity中创建自定义事件,并通过实例演示了如何使用这些事件进行游戏对象的状态跟踪,包括开始移动、移动中和移动结束等事件。

Unity 自定义事件 AddListerner

Unity中有的Button组件有onCick.AddListener属性,如果想要自己定义事件并能够像Button一样AddListener使用需要怎么做呢?
Unity中提供有UnityEvent类来用作事件的声明,下面直接放上代码,再一一说明。

CustomEventClass.cs

/* 事件类型的声明类 */
using UnityEngine.Events;
using UnityEngine;

// 开始移动事件
public class StartMoveEvent : UnityEvent<GameObject, string> {
   
   }

// 移动中事件
public class OnMoveEvent : UnityEvent<GameObject, string> {
   
   }

// 移动结束事件
public class EndMoveEvent : UnityEvent<GameObject, string> {
   
   }

这个类主要是声明几个自定义的事件,可以按照个人喜好和代码风格来确定放在一个脚本或者是跟逻辑脚本放在一起。
自定义的类继承了 UnityEvent 就成为了一个Unity的事件,支持多参数,但至多只能是4个,具体API可以看 Unit

Unity中,可以通过自定义事件系统来实现事件的注册、监听和触发。实现自定义事件系统的核心是创建一个事件管理工具类,用于统一管理事件的添加、移除和派发操作。以下是一个基于C#的实现示例: ### 自定义事件系统实现 创建一个名为 `EventUtil` 的静态类,用于管理事件的监听和触发: ```csharp using System; using System.Collections.Generic; using UnityEngine; public static class EventUtil { // 使用字典存储事件名称与对应的委托列表 private static Dictionary<string, Action<object[]>> eventDictionary = new Dictionary<string, Action<object[]>>(); // 添加事件监听器 public static void AddListener(string eventName, Action<object[]> callback) { if (eventDictionary.TryGetValue(eventName, out var callbacks)) { callbacks += callback; } else { eventDictionary.Add(eventName, callback); } } // 移除事件监听器 public static void RemoveListener(string eventName, Action<object[]> callback) { if (eventDictionary.TryGetValue(eventName, out var callbacks)) { callbacks -= callback; if (callbacks == null) { eventDictionary.Remove(eventName); } else { eventDictionary[eventName] = callbacks; } } } // 派发事件 public static void DispatchEvent(string eventName, params object[] parameters) { if (eventDictionary.TryGetValue(eventName, out var callback)) { callback?.Invoke(parameters); } else { Debug.LogWarning($"No listener for event: {eventName}"); } } } ``` ### 使用自定义事件系统 在具体的Unity脚本中,可以注册监听器并触发事件。例如: ```csharp public class EventTest : MonoBehaviour { void Start() { // 添加事件监听器 EventUtil.AddListener("TestEvent", OnTestEvent); // 触发事件 EventUtil.DispatchEvent("TestEvent", "Hello", 123); } void OnDestroy() { // 移除事件监听器 EventUtil.RemoveListener("TestEvent", OnTestEvent); } // 事件回调方法 private void OnTestEvent(object[] parameters) { foreach (var param in parameters) { Debug.Log($"Received parameter: {param}"); } } } ``` ### 关键点说明 1. **事件管理类**:`EventUtil` 类使用字典来存储事件名称和对应的委托列表,支持动态添加、移除和触发事件。 2. **多参数支持**:通过 `object[]` 参数,事件可以传递多个不同类型的值,提高了灵活性。 3. **内存管理**:在 `OnDestroy` 生命周期中移除事件监听器,可以避免内存泄漏问题。 ### 相关问题 1. 如何在Unity中实现跨组件通信的事件系统? 2. Unity自定义事件系统的性能优化方法有哪些? 3. 如何在Unity中实现带返回值的事件回调? 4. Unity中如何使用C#委托和事件实现事件驱动架构? 5. 在Unity中使用自定义事件系统时,如何避免重复注册监听器?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值