2016-08-06 2 views
0

유니티와 함께 ​​C#을 사용하고 있습니다. 유니티에 대해 도움이 될 필요는 없습니다. :) 나는 아직도 코딩에 익숙하지 않기 때문에 당신의 충고에 진심으로 감사 할 것입니다.버튼을 상호 작용 가능하게 만드는 방법 = 일부 목록의 내용을 기반으로하는 거짓?

나는 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. 위의 코드는 버튼을 비활성 상태로 만듭니다. foreach 루프에서는 목록의 모든 위치 인 문자열 항목을 만들었 기 때문입니다. 따라서 항목 목록에는 목록의 모든 위치에 항목이 있으므로 모든 버튼이 비활성화됩니다.

+0

'buttonList'는'List '이 아닌'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과 같은 항목 이름이 있지만 항목에서 알 수 있듯이 항목은 작은 글자로 시작합니다. 목록에있는 항목은 동일한 단어이지만 대문자로 시작합니다. 나는 지금 desing을 변경 했으므로 button_Item (큰 글자)이고 지금 코드를 변환하려고 시도하지만 아직 성공하지 못했습니다. 아직도 노력하고있어. 추신. 따라서 목록에는 "item01", "item02", "Word", "Differentword", "Anotherword"등이 없습니다. –

+0

좋아요, 아마 작동 합니다만 정확히 반대 동작을 원합니다 if list.Contains = true, interactable은 = false 여야합니다 :). 귀하의 예제에서 상호 작용을 true로 설정합니다. 그것을하는 방법을 시도. –

+0

그리고 작동합니다 : if (itemList.Contains (item) == true) button.interactable = false; 끝에 배치. 감사! –