C#:当在其他 3 个按钮上使用时,如何让按钮调用一次自身
C#: How do I get a button to call itself once when used on 3 other buttons
大约一个月前我已经 post 编辑了这个问题,但它得到了很多负面评论,因为我忘记了事先 post 代码。
我正在尝试让一个临时增益系统在这个游戏中工作,我想要它做的就是这个。当用户点击第一个按钮时,它会打开增益面板并让用户选择有多少增益。然后用户可以单击他们希望拥有的增益,它会更改第一个按钮的图像以匹配他们单击的增益。然后第二个和第三个按钮槽也会出现同样的想法。
目前,它正在执行所有这些操作,但是当单击第二个按钮时,它会将图片投射到第一个和第二个按钮上。然后当点击第三个按钮时,它会将图片投射到所有 3 个按钮上。从下面的代码来看,好像是因为每次点击buff时onClick都在添加监听,所以做了多次。但我不知道如何改变它,让它只出现一次。如果能得到所有帮助,我将不胜感激!
代码如下:
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 仅用于测试目的。
我终于能够让它按照我想要的方式工作。它只是在调用 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;
}
});`
这样,在添加任何侦听器之前,它会删除所有当前正在运行的侦听器,然后将新的侦听器添加到按钮。
感谢您的帮助!
大约一个月前我已经 post 编辑了这个问题,但它得到了很多负面评论,因为我忘记了事先 post 代码。
我正在尝试让一个临时增益系统在这个游戏中工作,我想要它做的就是这个。当用户点击第一个按钮时,它会打开增益面板并让用户选择有多少增益。然后用户可以单击他们希望拥有的增益,它会更改第一个按钮的图像以匹配他们单击的增益。然后第二个和第三个按钮槽也会出现同样的想法。
目前,它正在执行所有这些操作,但是当单击第二个按钮时,它会将图片投射到第一个和第二个按钮上。然后当点击第三个按钮时,它会将图片投射到所有 3 个按钮上。从下面的代码来看,好像是因为每次点击buff时onClick都在添加监听,所以做了多次。但我不知道如何改变它,让它只出现一次。如果能得到所有帮助,我将不胜感激!
代码如下:
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 仅用于测试目的。
我终于能够让它按照我想要的方式工作。它只是在调用 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;
}
});`
这样,在添加任何侦听器之前,它会删除所有当前正在运行的侦听器,然后将新的侦听器添加到按钮。
感谢您的帮助!