我已經發布了這個問題約一個月前,但它得到了很多負面評論,因爲我忘了事先發布代碼。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只用於測試目的。
這是使用Unity嗎?可能要這樣標記它。 –
哦,是的!這是團結,感謝提醒我!我現在要標記它。 – mSavari
我對Unity並不熟悉,但它看起來像是將多個事件處理程序附加到buff按鈕。每次調用addBuff時,都會爲每個按鈕添加另一個事件處理程序。之前的處理程序仍然持有對先前購買按鈕的引用。 –