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

在C#/Unity中基于多条件批量切换图片状态的优化方案问询

优化增量点击器的UI交互状态更新逻辑

你需要为80-100个不同的可点击图片更新交互状态,当前重复的if-else代码会导致维护困难,下面提供几种简化方案:

方案1:用条件表达式简化单行判断

直接把分支逻辑压缩成一行代码,省去冗余的if-else结构:

// 替代SetActive的if-else
hutClickYes.SetActive(data.food >= data.hutClickFoodConsumption && data.energy >= data.hutClickEnergyConsumption);

// 替代fillAmount的if-else
townPlannersClickYes.fillAmount = data.food >= data.townPlannersClickFoodConsumption && data.energy >= data.townPlannersClickEnergyConsumption ? 1 : 0;
hiRiseClickYes.fillAmount = data.food >= data.hiRiseClickFoodConsumption && data.energy >= data.hiRiseClickEnergyConsumption ? 1 : 0;

方案2:封装通用方法减少重复逻辑

把状态更新逻辑封装成通用方法,每个元素只需要一行调用代码:

// 处理SetActive类型的UI元素
private void UpdateActiveState(GameObject uiObj, int reqFood, int reqEnergy)
{
    uiObj.SetActive(data.food >= reqFood && data.energy >= reqEnergy);
}

// 处理fillAmount类型的UI元素
private void UpdateFillState(Image uiImg, int reqFood, int reqEnergy)
{
    uiImg.fillAmount = data.food >= reqFood && data.energy >= reqEnergy ? 1 : 0;
}

// 调用示例
UpdateActiveState(hutClickYes, data.hutClickFoodConsumption, data.hutClickEnergyConsumption);
UpdateFillState(townPlannersClickYes, data.townPlannersClickFoodConsumption, data.townPlannersClickEnergyConsumption);
UpdateFillState(hiRiseClickYes, data.hiRiseClickFoodConsumption, data.hiRiseClickEnergyConsumption);

方案3:配置化批量处理(最适合大量元素)

如果有80-100个元素,推荐用配置类+批量遍历的方式,彻底避免重复代码:

步骤1:定义配置类

[System.Serializable]
public class ClickableItemConfig
{
    // 根据元素类型选择赋值,不需要的留空
    public GameObject activeTarget; // 用SetActive控制的对象
    public Image fillTarget; // 用fillAmount控制的对象
    public int requiredFood;
    public int requiredEnergy;
}

步骤2:在Inspector中配置

在脚本中声明一个列表,然后在Unity编辑器里把每个可点击元素的参数拖入配置:

public List<ClickableItemConfig> clickableItems;

步骤3:批量更新状态

在需要更新UI的时机(比如资源变化时)遍历列表统一处理:

private void UpdateAllClickableStates()
{
    foreach (var item in clickableItems)
    {
        bool canInteract = data.food >= item.requiredFood && data.energy >= item.requiredEnergy;
        
        if (item.activeTarget != null)
        {
            item.activeTarget.SetActive(canInteract);
        }
        if (item.fillTarget != null)
        {
            item.fillTarget.fillAmount = canInteract ? 1 : 0;
        }
    }
}

这种方式新增元素时只需添加配置,不用修改代码,后期维护成本极低。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:31:04