如何根据某些列表的内容使 Buttons interactable=false?

How to make Buttons interactable=false based on the content of some list?

我将 c# 与 Unity 结合使用,尽管您可能不需要了解 Unity 也能提供帮助:)。非常感谢您的建议,因为我还是编码新手。

我有一个带有 8 个按钮的面板。每个都将 1 项添加到列表中。但是我需要检查玩家是否已经在他的列表中有那个项目(它是一个字符串名称),如果是的话,把那个项目对应的按钮变成 interactable=false.

换句话说,如果玩家有那个物品,我需要让添加那个物品的按钮失效(这样玩家就不能再次点击将它添加到列表中)。

项目只是项目列表中的字符串名称。 按钮运行 简单功能:ButtonList.Add("item1"),等等

我试过构建这样的东西:

     Button Btn_item0 = GameObject.Find ("Btn_item0").GetComponent <Button>();
     Button Btn_item1 = GameObject.Find ("Btn_item1").GetComponent <Button>();
     Button Btn_item2 = GameObject.Find ("Btn_item2").GetComponent <Button>();
     Button Btn_item3 = GameObject.Find ("Btn_item3").GetComponent <Button>();
     Button Btn_item4 = GameObject.Find ("Btn_item4").GetComponent <Button>();
     Button Btn_item5 = GameObject.Find ("Btn_item5").GetComponent <Button>();
     Button Btn_item6 = GameObject.Find ("Btn_item6").GetComponent <Button>();
     Button Btn_item7= GameObject.Find ("Btn_item7").GetComponent <Button>();

     List<Button> buttonList = new List<Button>() {Btn_item0, Btn_item1, Btn_item2, Btn_item3, Btn_item4, Btn_item5, Btn_item6, Btn_item7};
     List<string> itemList = new List<string>() {"item0", "item1", "item2", "item3", "item4", "item5", "item6", "item7"};

     foreach (Button button in buttonList) {
         foreach (string item in itemList) {
             if (itemList.Contains (item))
                 button.interactable = false;
         }
     }

但显然这行不通。你如何正确地做到这一点?

Ps。以上使 all 按钮处于非活动状态,因为在 foreach 循环中我们创建了字符串项,它是列表中的每个位置。所以项目列表包含列表的每个位置的项目,因此所有按钮都变为非活动状态。

与其制作一个按钮列表,不如制作一个 Dictionary 按钮列表,将它们的名称作为键?基本概念是

var buttons = new Dictionary<string, Button> {
    ("item0", Btn_item0),
    ("item1", Btn_item1),
    ("item2", Btn_item2),
    ("item3", Btn_item3),
    ("item4", Btn_item4),
    ("item5", Btn_item5), 
    ("item6", Btn_item6), 
    ("item7", Btn_item7)
};

但是你可以自动化这个

var buttons = new Dictionary<string, Button> ();
for (int i = 0; i < 8 /*number of buttons*/; i++) {
    var itemLabel = "item" + i;
    var button = GameObject.Find ("Btn_" + itemLabel).GetComponent ("Button");
    buttons[itemLabel] = button;
}

现在你需要做的就是遍历每个按钮及其对应的项目,然后 disable/enable 如果它的项目在玩家的 itemList 或不

foreach (var labeledButton in buttons) {
    var itemLabel = labeledButton.Key;
    var button = labeledButton.Value;
    button.interactable = !itemList.contains(itemLabel);
}

完整代码为:

var buttons = new Dictionary<string, Button>();
for (int i = 0; i < 8 /*number of buttons*/; i++) {
    var itemLabel = "item" + i;
    var button = GameObject.Find ("Btn_" + itemLabel).GetComponent ("Button");
    buttons[itemLabel] = button;
}

var itemList = new List<string>() {"item0", "item1", "item2", "item3", "item4", "item5", "item6", "item7"};

foreach (var labeledButton in buttons) {
    var itemLabel = labeledButton.Key;
    var button = labeledButton.Value;
    button.interactable = !itemList.contains(itemLabel);
}

你甚至可以将buttons保存到一个实例变量中,你只需要在初始化时设置它。