2016-08-06 3 views
0

Я использую C# с Unity, хотя вам, вероятно, не нужно знать Unity, чтобы помочь здесь :). Я был бы очень признателен за ваш совет, поскольку я все еще новичок в кодировании.Как сделать кнопки интерактивными = ложными на основе содержимого какого-либо списка?

У меня есть панель с 8 кнопками. Каждый добавляет 1 элемент в список. Но мне нужно проверить, есть ли у игрока уже этот элемент в его списке (это имя строки), и если это так, поверните кнопку, соответствующую этому элементу, на interactiveable = 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 мы создали строковый элемент, который является каждой позицией в списке. Таким образом, список элементов содержит элемент для каждой позиции списка, поэтому все кнопки становятся неактивными.

+0

'buttonList' должен быть' List

+0

Да, извините, это была опечатка здесь. Исправлено, но вопрос открыт. –

ответ

0

Вместо того, чтобы составлять список кнопок, почему бы не сделать их 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 в переменную экземпляра, и вам нужно будет только установить ее при инициализации.

+0

Ницца, это было бы здорово, но, возможно, я написал свой пример неправильно - элементы один в списке не имеют чисел, просто строки без повторной последовательности. Каждый элемент - это просто другое слово. Кнопки имеют такие имена элементов, как это: button_item, но, как видите, элементы начинаются с маленьких букв. Элементы в списке - это те же слова, но начиная с большой буквы. Я изменил представление, так что это button_Item (большая буква), и я пытаюсь преобразовать ваш код сейчас, но пока ничего не добился. Все еще пытаюсь. Ps. Таким образом, в списке нет «item01», «item02», просто «Word», «Differentword», «Anotherword» и т. Д. –

+0

Хорошо, я получил работу, возможно, но я хочу точно противоположное поведение = if list.Contains = true, interactiveable должно быть = false :). В вашем примере он устанавливает интерактивность в true. Попытка, как это сделать. –

+0

И он работает, сделал это с: if (itemList.Contains (item) == true) button.interactable = false; помещается в конце. Благодаря! –