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

Unity中能否用单个foreach循环为Button、Toggle统一添加PointerEnter音效?

泛型方法报错原因

  • 泛型参数T在方法调用时是单一确定的类型,比如你调用AddToList<Button>()时T就是Button类型,自然无法存储Toggle类型对象;就算你指定T为Selectable,也需要显式完成子类型到父类型的转换才能添加到列表,你当前的写法没有做对应处理,所以会报转换失败错误。
  • 你的需求本身不需要使用泛型,Button和Toggle共同的父类Selectable已经包含了你需要用到的gameObject属性,直接声明List<Selectable>存储两类组件即可。

单循环实现方案

直接把两类组件都加入List<Selectable>后统一遍历即可,优化后的代码如下(额外补充了组件存在性判断,避免重复添加EventTrigger):

private void SoundsOnButtons()
{
    List<Selectable> selectables = new List<Selectable>();
    selectables.AddRange(Resources.FindObjectsOfTypeAll<Button>());
    selectables.AddRange(Resources.FindObjectsOfTypeAll<Toggle>());

    foreach (var obj in selectables)
    {
        EventTrigger trigger = obj.gameObject.GetComponent<EventTrigger>();
        if (trigger == null)
        {
            trigger = obj.gameObject.AddComponent<EventTrigger>();
        }

        EventTrigger.Entry eventEnter = new EventTrigger.Entry();
        eventEnter.eventID = EventTriggerType.PointerEnter;
        eventEnter.callback.AddListener((eventData) => {
            Sound.PlaySfxOneShot(Sound.GiveSfxSound(7));
        });

        trigger.triggers.Add(eventEnter);
    }
}

内容的提问来源于stack exchange,提问作者Ronny Bigler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 17:54:01