2017-03-06 4 views
0

この質問は1ヶ月前に既に投稿していましたが、あらかじめコードを投稿するのを忘れていたので、C#:他の3つのボタンでボタンを使用すると、ボタンを一度呼び出す方法

私は一時的なバフシステムをこのゲームで動かそうとしています。私はそれがこれでいいと思っています。ユーザーが最初のボタンをクリックすると、バフパネルが開き、バフがどれくらいあるかを選択できます。その後、ユーザーは必要とするバフをクリックすることができ、クリックしたバフに合わせて最初のボタンのイメージが変更されます。次に、2番目と3番目のボタンスロットについても同様の考えができます。

現在のところ、すべてのことを行っていますが、2番目のボタンをクリックすると、1番目と2番目のボタンの両方に画像がキャストされます。 3番目のボタンをクリックすると、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に設定されています。

+0

Unityを使用していますか?そのようにタグ付けしたいかもしれません。 –

+0

ああああ!それは統一です、私に思い出させてくれてありがとう!私は今それをタグ付けします。 – mSavari

+2

私はUnityに精通していませんが、複数のイベントハンドラをバフボックスにつけているようです。 '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; 
     } 
    });` 

こうすることで、任意のリスナーを追加する前に、現在のボタンに新しいものを追加し操作するすべてのリスナーを削除します。

お手数をおかけしていただきありがとうございます。

関連する問題