如何根据某个列表的内容使按钮可交互=false

本文关键字:按钮 交互 false 何根 列表 | 更新日期: 2023-09-27 18:01:03

我在Unity中使用c#,尽管您可能不需要了解Unity就可以在这里提供帮助:(。我真的很感激你的建议,因为我对编码还是个新手。

我有一个有8个按钮的面板。每个都会向列表中添加1项。但我需要检查玩家的列表中是否已经有该项目(它是一个字符串名称(,如果是,请将该项目对应的按钮转到interactive=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。上述操作使所有按钮处于非活动状态,因为在foreach循环中,我们创建了字符串项,该项位于列表上的每个位置。所以项目列表在列表的每个位置都包含项目,所以所有按钮都处于非活动状态。

如何根据某个列表的内容使按钮可交互=false

与其制作按钮列表,为什么不制作一个以按钮名称为键的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;
}

现在,你所需要做的就是查看每个按钮及其对应的项目,如果其项目在玩家的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保存到实例变量中,并且只需要在初始化时设置它。