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

Unity实现Toggle单选功能:点击一个Toggle时自动关闭其余所有Toggle

问题原因分析
  • 循环逻辑存在致命错误:原有ToggleValueChanged方法的循环中,当匹配到和当前触发事件相同索引的元素时直接执行return,会导致索引大于当前index的Toggle完全不会被执行关闭逻辑
  • 没有处理连锁回调问题:当你手动修改其他Toggle的isOn属性为false时,会触发这些Toggle自身绑定的onValueChanged事件,连环回调会干扰当前选中Toggle的状态,最终出现全部关闭的异常
  • 不符合单选交互逻辑:单选要求点击任意Toggle后该Toggle保持开启,原有代码没有限制选中项的状态,用户点击已开启的Toggle时会直接将其关闭,导致全空状态
修正后代码
public Toggle[] toggle;
// 增加状态锁,避免批量修改时触发连锁回调
private bool isUpdatingToggles = false;

void Start () {
    for (int i = 0; i < toggle.Length; i++) {
        int idx = i;
        toggle[idx].onValueChanged.AddListener(delegate {
            ToggleValueChanged(toggle[idx], idx);
        });
    }
}

public void ToggleValueChanged (Toggle change, int index) {
    // 批量修改状态时直接跳过,避免重复触发逻辑
    if (isUpdatingToggles) return;

    // 单选状态下强制被点击的Toggle保持开启,不需要可删除该行(删除后支持全关状态)
    if (!change.isOn) { change.isOn = true; return; }

    // 加锁后批量关闭其他Toggle
    isUpdatingToggles = true;
    for (int i = 0; i < toggle.Length; i++) {
        if (i != index) {
            toggle[i].isOn = false;
        }
    }
    isUpdatingToggles = false;
}
原生替代方案

Unity内置ToggleGroup组件可以无需编码直接实现单选效果:

  • 在父物体上新建ToggleGroup组件
  • 将所有需要单选的Toggle的Group属性设置为上述新建的ToggleGroup对象
  • 可选配置:勾选ToggleGroup的Allow Switch Off即可支持全部Toggle都关闭的状态,不勾选则强制始终有一个Toggle处于选中状态

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 06:36:02