You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何动态增量声明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);
        }
    }
}

方案说明

  1. 动态事件列表:用List<UnityEvent>替代硬编码的单个字段,通过OnValidate()方法在Inspector修改eventCount时自动调整列表长度,实现事件数量的动态配置。
  2. 增量触发逻辑:通过currentTriggerIndex记录当前触发位置,每次调用TriggerEvents()时触发对应索引的事件,索引自动递增,超出总数时给出警告。
  3. Inspector友好性:基础版本直接使用Unity默认的List序列化显示;进阶版本通过自定义Editor将每个事件显示为onTriggeredX格式,保持原使用习惯。
  4. 重置功能:新增ResetTriggerSequence()方法,可重置触发索引,支持重复触发整个事件序列。

内容的提问来源于stack exchange,提问作者Chiril Russu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 12:07:12