如何根据某些列表的内容使 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
保存到一个实例变量中,你只需要在初始化时设置它。
我将 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
保存到一个实例变量中,你只需要在初始化时设置它。