2016-08-06 7 views
0

Ich benutze C# mit Unity, obwohl du wahrscheinlich nicht wissen musst, dass Unity hier hilft :). Ich würde Ihren Rat sehr schätzen, da ich noch neu in der Codierung bin.Wie mache ich Buttons interactible = false basierend auf dem Inhalt einer Liste?

Ich habe ein Panel mit 8 Tasten. Jeder fügt 1 Element zur Liste hinzu. Aber ich muss überprüfen, ob der Spieler dieses Element bereits auf seiner Liste hat (es ist ein String-Name), und wenn ja, dann drehe den Button, der diesem Item entspricht, auf interactibable = false.

Mit anderen Worten, wenn der Spieler diesen Gegenstand hat, muss ich den Knopf machen, der diesen Gegenstand inaktiv macht (damit der Spieler nicht klicken kann, um ihn wieder zur Liste hinzuzufügen).

Die Elemente sind nur String-Namen auf der Liste der Elemente. Buttons führen einfache Funktionen aus: ButtonList.Add ("item1"), und so weiter.

Ich habe versucht, so etwas wie dieses Gebäude:

 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; 
     } 
    } 

Aber offensichtlich wird dies nicht funktionieren. Wie machst du das richtig?

Ps. Das obige macht alle Schaltflächen inaktiv, weil wir in foreach Schleife String-Element erstellt haben, das jede Position auf der Liste ist. Die Artikelliste enthält also einen Gegenstand an jeder Position der Liste, so dass alle Knöpfe inaktiv werden.

+0

'buttonList' sollte' List

+0

Ja, sorry, das war ein Tippfehler hier. Behoben, aber die Frage ist offen. –

Antwort

0

Anstatt eine Liste von Tasten zu machen, warum nicht eine Dictionary von ihnen machen, mit ihren Namen als Schlüssel? Das Grundkonzept ist

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) 
}; 

Aber man könnte diese

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; 
} 

Jetzt müssen alles, was Sie automatisieren zu tun ist jede Taste mit dem entsprechenden Punkt durchgehen, und deaktivieren/aktivieren Sie es, wenn seine Artikel in der ist itemList oder nicht

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

Der vollständige Code des Spielers ist:

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); 
} 

Sie könnten sogar buttons in einer Instanzvariable speichern, und Sie müssten es nur bei der Initialisierung einrichten.

+0

Schön, das wäre toll, aber vielleicht habe ich mein Beispiel falsch geschrieben - Items die eine Liste haben keine Nummern, nur Strings ohne Wiederholungsfolge. Jeder Gegenstand ist nur ein anderes Wort. Schaltflächen haben die folgenden Objektnamen: button_item, aber wie Sie sehen, beginnen Elemente mit kleinen Buchstaben. Einträge auf der Liste sind dieselben Wörter, beginnen jedoch mit einem großen Buchstaben. Ich habe das Design für jetzt geändert, also ist es button_Item (großer Buchstabe) und ich versuche jetzt, deinen Code zu konvertieren, aber noch keinen Erfolg. Versuche es trotzdem. Ps. Also gibt es kein "item01", "item02" auf der Liste, nur "Word", "Differentword", "Anotherword" usw. –

+0

Ok, ich habe es wahrscheinlich funktioniert, aber ich will genau das Gegenteil verhalten = if list.Contains = true, interactable muss = false sein :). In Ihrem Beispiel wird die Interaktivität auf "wahr" gesetzt. Versuchen, wie es geht. –

+0

Und es funktioniert, machte es mit: if (itemList.Contains (Element) == wahr) button.interactable = false; am Ende platziert. Vielen Dank! –

Verwandte Themen