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
相关产品推荐
相关产品推荐

