2017-01-26 6 views
-4

В настоящее время я работаю над игрой, и я пытаюсь создать систему слотов с 3 кнопками и буфером с 7 кнопками. То, что я хочу сделать, - это каждый раз, когда щелкают кнопку слота buff, он откроет панель магазина buff, и когда пользователь нажмет на один из 7 баффов на панели, изображение кнопки buff переместится в кнопку слота buff.Button называет себя много раз

Я реализовал практически все, поэтому, когда я щелкаю первый слот для баффа и выбираю бафф, изображение слота buff изменится на выбранный buff. Но когда я нажимаю на второй слот buff и выбираю еще один бафф, он заменяет изображение на обеих кнопках. И тогда третий будет делать то же самое для всех 3 кнопок. Почти как рекурсивно называть себя, когда я нажимаю на другие кнопки. Как я могу избежать кнопок от изменения изображений других кнопок? Я довольно новичок в Unity/C#, и я был бы признателен за любое предложение, которое я могу получить.

EDIT: Извините! Я полностью забыл даже опубликовать код. Это моя ошибка! Вот то, что я до сих пор:

//This is where I initialize the buttons under Start() 
    buffSlot_1.GetComponent<Button>(); 
    buffSlot_1.onClick.AddListener(() => addBuff(buffSlot_1)); 

    buffSlot_2.GetComponent<Button>(); 
    buffSlot_2.onClick.AddListener(() => addBuff(buffSlot_2)); 

    buffSlot_3.GetComponent<Button>(); 
    buffSlot_3.onClick.AddListener(() => addBuff(buffSlot_3)); 

Это то, что делает метод:

void addBuff(Button button) { 

    buffPanel.GetComponent<GameObject>(); 
    buffPanel.SetActive(true); 

    damageBoostButton.GetComponent<Button>(); 
    damageBoostButton.onClick.AddListener(() => { 
     Debug.Log("Gain a damage boost!"); 
     dmgBool = true; 
     buffPanel.SetActive(false); 
     button.interactable = false; 
     damageBoostButton.interactable = false; 
     button.image.overrideSprite = damageBoostButton.image.sprite; 
    }); 

    defenseBoostButton.GetComponent<Button>(); 
    defenseBoostButton.onClick.AddListener(() => { 
     Debug.Log("Gain a defense boost!"); 
     defBool = true; 
     buffPanel.SetActive(false); 
     button.interactable = false; 
     defenseBoostButton.interactable = false; 
     button.image.overrideSprite = defenseBoostButton.image.sprite; 
    }); 

    critBoostButton.GetComponent<Button>(); 
    critBoostButton.onClick.AddListener(() => { 
     Debug.Log("Crit Boost"); 
     critBool = true; 
     buffPanel.SetActive(false); 
     button.interactable = false; 
     critBoostButton.interactable = false; 
     button.image.overrideSprite = critBoostButton.image.sprite; 
    }); 

    hasteBoostButton.GetComponent<Button>(); 
    hasteBoostButton.onClick.AddListener(() => { 
     Debug.Log("Haste Boost"); 
     hasteBool = true; 
     buffPanel.SetActive(false); 
     button.interactable = false; 
     hasteBoostButton.interactable = false; 
     button.image.overrideSprite = hasteBoostButton.image.sprite; 
    }); 

    iceSpikeButton.GetComponent<Button>(); 
    iceSpikeButton.onClick.AddListener(() => { 
     Debug.Log("Increase Ice Spike"); 
     iceSpikeBool = true; 
     buffPanel.SetActive(false); 
     button.interactable = false; 
     iceSpikeButton.interactable = false; 
     button.image.overrideSprite = iceSpikeButton.image.sprite; 
    }); 

    iceWallButton.GetComponent<Button>(); 
    iceWallButton.onClick.AddListener(() => { 
     Debug.Log("Increase Ice Wall"); 
     iceWallBool = true; 
     buffPanel.SetActive(false); 
     button.interactable = false; 
     iceWallButton.interactable = false; 
     button.image.overrideSprite = iceWallButton.image.sprite; 
    }); 

    healthRegenButton.GetComponent<Button>(); 
    healthRegenButton.onClick.AddListener(() => { 
     Debug.Log("HPRegen Boost"); 
     hpRegenBool = true; 
     buffPanel.SetActive(false); 
     button.interactable = false; 
     healthRegenButton.interactable = false; 
     // button.image.overrideSprite = healthRegenButton.image.sprite; 
    }); 
} 

Спасибо!

+2

нет кода, никто не знает – BWA

+1

Так вы спрашиваете нас, где ваш код вызова данного метода, но вы отказываетесь, чтобы показать нам свой код. Я ставлю 10 долларов в строке 123, дайте мне знать, если я выиграю пул. –

+2

Пожалуйста, прочитайте страницу [Как спросить] (http://stackoverflow.com/help/how-to-ask), в частности это предложение: «Включите достаточно кода, чтобы другие могли воспроизвести проблему. прочитайте [Как создать минимальный, полный и проверенный пример.] (http://stackoverflow.com/help/mcve) " – Quantic

ответ

0

Я не кодирую в Unity, поэтому рассмотрим некоторые из этого «псевдокода». Однако общая идея должна быть работоспособной.

Изменения: слушатели буферов теперь добавляются только один раз в Start(). У этих же слушателей есть ссылки на button, замененные на ActiveButton. Нажатие кнопки «buff-slot» теперь назначает только активную кнопку, а затем открывает буффер. У кнопок буфериста теперь только 1 слушатель, потому что новые слушатели больше не добавляются после начала(), и каждый слушатель будет использовать ActiveButton, чтобы назначать изображения только активной кнопке, а не каждому добавленному слушателю.

Примечание: перед этим изменением, если вы нажмете бафф-слот 100 раз, вы получите 100 слушателей в каждом буфете, потому что каждый раз, когда вы нажимаете кнопку, он добавляет нового слушателя. Это в основном утечка памяти в дополнение к другим проблемам, которые она имеет. Вы должны добавлять только слушателей один раз или удалять их, когда вы закончите с ними. Код здесь только добавляет их один раз.

// Some globally visible area of your code 
public Button ActiveButton { get; set; } 

//This is where I initialize the buttons under Start() 
void Start() 
{ 
    buffSlot_1.GetComponent<Button>(); 
    buffSlot_1.onClick.AddListener(() => addBuff(buffSlot_1)); 

    buffSlot_2.GetComponent<Button>(); 
    buffSlot_2.onClick.AddListener(() => addBuff(buffSlot_2)); 

    buffSlot_3.GetComponent<Button>(); 
    buffSlot_3.onClick.AddListener(() => addBuff(buffSlot_3)); 

    // Initialize buff slot listeners. These are added only once in Start() 
    damageBoostButton.GetComponent<Button>(); 
    damageBoostButton.onClick.AddListener(() => { 
     Debug.Log("Gain a damage boost!"); 
     dmgBool = true; 
     buffPanel.SetActive(false); 
     ActiveButton.interactable = false; 
     damageBoostButton.interactable = false; 
     ActiveButton.image.overrideSprite = damageBoostButton.image.sprite; 
    }); 

    defenseBoostButton.GetComponent<Button>(); 
    defenseBoostButton.onClick.AddListener(() => { 
     Debug.Log("Gain a defense boost!"); 
     defBool = true; 
     buffPanel.SetActive(false); 
     ActiveButton.interactable = false; 
     defenseBoostButton.interactable = false; 
     ActiveButton.image.overrideSprite = defenseBoostButton.image.sprite; 
    }); 

    critBoostButton.GetComponent<Button>(); 
    critBoostButton.onClick.AddListener(() => { 
     Debug.Log("Crit Boost"); 
     critBool = true; 
     buffPanel.SetActive(false); 
     ActiveButton.interactable = false; 
     critBoostButton.interactable = false; 
     ActiveButton.image.overrideSprite = critBoostButton.image.sprite; 
    }); 

    hasteBoostButton.GetComponent<Button>(); 
    hasteBoostButton.onClick.AddListener(() => { 
     Debug.Log("Haste Boost"); 
     hasteBool = true; 
     buffPanel.SetActive(false); 
     ActiveButton.interactable = false; 
     hasteBoostButton.interactable = false; 
     ActiveButton.image.overrideSprite = hasteBoostButton.image.sprite; 
    }); 

    iceSpikeButton.GetComponent<Button>(); 
    iceSpikeButton.onClick.AddListener(() => { 
     Debug.Log("Increase Ice Spike"); 
     iceSpikeBool = true; 
     buffPanel.SetActive(false); 
     ActiveButton.interactable = false; 
     iceSpikeButton.interactable = false; 
     ActiveButton.image.overrideSprite = iceSpikeButton.image.sprite; 
    }); 

    iceWallButton.GetComponent<Button>(); 
    iceWallButton.onClick.AddListener(() => { 
     Debug.Log("Increase Ice Wall"); 
     iceWallBool = true; 
     buffPanel.SetActive(false); 
     ActiveButton.interactable = false; 
     iceWallButton.interactable = false; 
     ActiveButton.image.overrideSprite = iceWallButton.image.sprite; 
    }); 

    healthRegenButton.GetComponent<Button>(); 
    healthRegenButton.onClick.AddListener(() => { 
     Debug.Log("HPRegen Boost"); 
     hpRegenBool = true; 
     buffPanel.SetActive(false); 
     ActiveButton.interactable = false; 
     healthRegenButton.interactable = false; 
     ActiveButton.image.overrideSprite = healthRegenButton.image.sprite; 
    }); 
} 

// Clicking a buff-slot button opens the buff-shop, 
// and assigns the global ActiveButton variable to the button that was clicked. 
void addBuff(Button button) { 

    buffPanel.GetComponent<GameObject>(); 
    buffPanel.SetActive(true); 

    ActiveButton = button; 
} 
+0

Я понимаю, что вы говорите. только сейчас, и это не совсем сработало. Но спасибо для вашей помощи! Я буду продолжать играть с этим синтаксисом и посмотреть, что я могу получить от него. :) – mSavari