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

