Unity中foreach循环导致最后一个选项按钮无法正常变色问题
问题分析与解决方案
核心问题拆解
- 循环逻辑完全倒置:原代码在遍历选项时,先将选中项标记为已点击,紧接着又把当前遍历到的选项标记为未点击。当选中最后一个选项时,遍历到它的瞬间,刚设置的
HasClickedOn=true会立刻被覆盖为false,导致状态不生效。 - 错误的中断逻辑:第一个循环中,只要有一个按钮的
StringforQuestion为空就直接return,会中断后续所有按钮的状态同步。 - 冗余的查找操作:循环内重复调用
Find方法查找选中项,既浪费性能又增加代码复杂度。
修正后的代码
public void Update() { // 当前问题为空时直接返回 if (CurrentQuestion == null) return; // 同步按钮状态到ScriptableObject foreach (var item in ListOfCurrentButtons) { // 跳过空文本的按钮,不中断整个流程 if (item.ChoiceHolder.StringforQuestion == null) continue; var correspondingItem = CurrentQuestion.RngQU.Find(x => x.StringforQuestion == item.ChoiceHolder.StringforQuestion); if (correspondingItem != null) correspondingItem.HasClickedOn = item.ChoiceHolder.HasClickedOn; } // 无选中项时直接返回 if (currentChoice == null) return; // 提前获取选中项,避免重复查找 var selectedItem = CurrentQuestion.RngQU.Find(x => x.StringforQuestion == currentChoice.StringforQuestion); if (selectedItem == null) return; // 先统一重置所有选项为未点击状态 foreach (var item in CurrentQuestion.RngQU) { item.HasClickedOn = false; } // 单独标记选中项为已点击 selectedItem.HasClickedOn = true; }
关键改动说明
- 将第一个循环中的
return改为continue:确保单个按钮数据异常时,其他按钮仍能正常同步状态。 - 重构选中状态设置逻辑:先把所有选项重置为未点击,再单独标记选中项,彻底避免了遍历过程中状态被覆盖的问题,无论选中哪个选项(包括最后一个)都能正确更新状态。
- 优化查找操作:提前一次获取选中项,避免循环内重复执行查找,提升代码效率与可读性。
内容的提问来源于stack exchange,提问作者Bryce Robinson
相关产品推荐
相关产品推荐

