2017-03-06 21 views
0

我已經發布了這個問題約一個月前,但它得到了很多負面評論,因爲我忘了事先發布代碼。C#:我如何得到一個按鈕來調用自己一次,當使用其他3個按鈕

我想獲得一個臨時的緩衝系統在這個遊戲中工作,我想要它做的是這樣的。當用戶點擊第一個按鈕時,它會打開拋光面板,並讓用戶選擇有多少拋光效果。然後用戶可以點擊他們希望擁有的buff,它會改變第一個按鈕的圖像以匹配他們點擊的buff。然後對於第二個和第三個按鈕插槽也會發生同樣的想法。

目前,它正在做的只是當第二個按鈕被點擊時,它會在第一個和第二個按鈕上投射圖片。然後當點擊第三個按鈕時,它將在所有3個按鈕上投射圖片。從下面的代碼看來,原因似乎是因爲onClick在每次點擊buff時添加了監聽器,所以它會多次執行該操作。但我不知道如何改變它,所以它只會發生一次。我將很感激所有我能得到的幫助!

的代碼如下:

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

void addBuff(Button purchaseButton) { 

    buffPanel.SetActive(true); 

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

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

    critBoostButton.GetComponent<Button>(); 
    critBoostButton.onClick.AddListener(() => { 
     if (coinCount >= 0) { 
      Debug.Log("Crit Boost"); 
      critBool = true; 
      buffPanel.SetActive(false); 
      purchaseButton.interactable = false; 
      critBoostButton.interactable = false; 
      purchaseButton.image.sprite = critBoostButton.image.sprite; 
      coinCount -= 0; 
     } 
    }); 

    hasteBoostButton.GetComponent<Button>(); 
    hasteBoostButton.onClick.AddListener(() => { 
     if (coinCount >= 0) { 
      Debug.Log("Haste Boost"); 
      hasteBool = true; 
      buffPanel.SetActive(false); 
      purchaseButton.interactable = false; 
      hasteBoostButton.interactable = false; 
      purchaseButton.image.sprite = hasteBoostButton.image.sprite; 
      coinCount -= 0; 
     } 
    }); 

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

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

    healthRegenButton.GetComponent<Button>(); 
    healthRegenButton.onClick.AddListener(() => { 
     if (coinCount >= 0) { 
      Debug.Log("HPRegen Boost"); 
      hpRegenBool = true; 
      buffPanel.SetActive(false); 
      purchaseButton.interactable = false; 
      healthRegenButton.interactable = false; 
      purchaseButton.image.sprite = healthRegenButton.image.sprite; 
      coinCount -= 0; 
     } 
    }); 
} 

的coinCounts被設置爲0只用於測試目的。

+0

這是使用Unity嗎?可能要這樣標記它。 –

+0

哦,是的!這是團結,感謝提醒我!我現在要標記它。 – mSavari

+2

我對Unity並不熟悉,但它看起來像是將多個事件處理程序附加到buff按鈕。每次調用addBuff時,都會爲每個按鈕添加另一個事件處理程序。之前的處理程序仍然持有對先前購買按鈕的引用。 –

回答

0

我終於能夠按照我想要的方式工作。在調用addListener之前,只需在addBuff方法中的每個按鈕的onClick上添加RemoveAllListeners即可。

因此在方法中的每個按鈕看起來就像這樣:

`damageBoostButton.onClick.RemoveAllListeners(); 
    damageBoostButton.onClick.AddListener(() => { 
     if (coinCount >= 500) { 
      Debug.Log("Gain a damage boost!"); 
      dmgBool = true; 
      buffPanel.SetActive(false); 
      purchaseButton.interactable = false; 
      damageBoostButton.interactable = false; 
      purchaseButton.image.sprite = damageBoostButton.image.sprite; 
      coinCount -= 500; 
     } 
    });` 

這樣一來,添加任何偵聽器之前,它會刪除所有監聽器目前經營再添加新的按鈕。

感謝您試圖幫助傢伙!

相關問題