如何动态增量声明Unity公开事件并按整数顺序触发?
动态增量触发UnityEvent的优化实现
问题背景
需要按指定顺序增量触发N个方法,每个方法对应一个public UnityEvent(支持在Unity Inspector中配置自定义功能)。当前硬编码10个UnityEvent及判断逻辑的方案冗余且无法动态调整数量,期望改为可在Inspector设置整数N,自动生成N个命名为onTriggeredX的UnityEvent,调用triggerEvents()时依次触发所有事件。
核心实现方案
基础版本(无需自定义Editor)
using UnityEngine; using UnityEngine.Events; using System.Collections.Generic; public class IncrementEventHandler : MonoBehaviour { [Tooltip("设置需要生成的事件总数")] public int eventCount = 10; [SerializeField] private List<UnityEvent> triggeredEvents = new List<UnityEvent>(); private int currentTriggerIndex = 0; // 在Inspector参数变更时自动同步事件列表长度 private void OnValidate() { // 补充不足的事件实例 while (triggeredEvents.Count < eventCount) { triggeredEvents.Add(new UnityEvent()); } // 移除超出数量的事件 while (triggeredEvents.Count > eventCount) { triggeredEvents.RemoveAt(triggeredEvents.Count - 1); } } // 增量触发下一个事件 public void TriggerEvents() { if (currentTriggerIndex >= triggeredEvents.Count) { Debug.LogWarning("所有事件已触发完毕,无法继续调用"); return; } triggeredEvents[currentTriggerIndex].Invoke(); currentTriggerIndex++; } // 重置触发索引,可重新开始触发流程 public void ResetTriggerSequence() { currentTriggerIndex = 0; } }
进阶版本(自定义Editor优化Inspector显示)
如果希望Inspector中每个事件显示为onTriggeredX的命名(和原硬编码版本体验一致),可添加自定义Editor脚本:
using UnityEditor; using UnityEngine; [CustomEditor(typeof(IncrementEventHandler))] public class IncrementEventHandlerEditor : Editor { public override void OnInspectorGUI() { var handler = target as IncrementEventHandler; // 绘制事件数量配置字段 handler.eventCount = EditorGUILayout.IntField("事件总数", handler.eventCount); // 同步事件列表长度 handler.OnValidate(); // 逐个绘制事件,自定义显示名称 for (int i = 0; i < handler.triggeredEvents.Count; i++) { EditorGUILayout.Space(); EditorGUILayout.LabelField($"onTriggered{i + 1}", EditorStyles.boldLabel); handler.triggeredEvents[i] = (UnityEvent)EditorGUILayout.ObjectField(handler.triggeredEvents[i], typeof(UnityEvent), true); } // 保存Inspector修改 if (GUI.changed) { EditorUtility.SetDirty(target); } } }
方案说明
- 动态事件列表:用
List<UnityEvent>替代硬编码的单个字段,通过OnValidate()方法在Inspector修改eventCount时自动调整列表长度,实现事件数量的动态配置。 - 增量触发逻辑:通过
currentTriggerIndex记录当前触发位置,每次调用TriggerEvents()时触发对应索引的事件,索引自动递增,超出总数时给出警告。 - Inspector友好性:基础版本直接使用Unity默认的List序列化显示;进阶版本通过自定义Editor将每个事件显示为
onTriggeredX格式,保持原使用习惯。 - 重置功能:新增
ResetTriggerSequence()方法,可重置触发索引,支持重复触发整个事件序列。
内容的提问来源于stack exchange,提问作者Chiril Russu
相关产品推荐
相关产品推荐

