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

这样,在添加任何侦听器之前,它会删除所有当前正在运行的侦听器,然后将新的侦听器添加到按钮。

感谢您的帮助!