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

Unity中foreach循环导致最后一个选项按钮无法正常变色问题

问题分析与解决方案

核心问题拆解

  1. 循环逻辑完全倒置:原代码在遍历选项时,先将选中项标记为已点击,紧接着又把当前遍历到的选项标记为未点击。当选中最后一个选项时,遍历到它的瞬间,刚设置的HasClickedOn=true会立刻被覆盖为false,导致状态不生效。
  2. 错误的中断逻辑:第一个循环中,只要有一个按钮的StringforQuestion为空就直接return,会中断后续所有按钮的状态同步。
  3. 冗余的查找操作:循环内重复调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 05:52:46