2016-05-10 8 views
0

Я пытаюсь сделать простое условие:Interactable кнопки ЕДИНСТВА

Если значение у меня есть, это меньше, чем цена это стоит детали, кнопка отключена.

Если значение, которое у меня есть, больше или равно цене, которую оно стоит, кнопка включена, и я могу ее купить.

Но когда я тестирую, у меня есть некоторые проблемы.

Во-первых, если у меня меньше стоимости предмета, кнопка включена, и только когда я нажимаю на нее, она отключается.

Во-вторых, если у меня меньше стоимости предмета, и я нажимаю на него, он отключается, но если я получу достаточно, чтобы купить товар, кнопка не будет включена снова.

Как мне проверять эти переменные все время? Если у меня достаточно кнопки, она включена, если у вас ее нет.

пыльника моих сум:

using UnityEngine; 
    using System.Collections; 
    using UnityEngine.UI; 

    public class BuySkin : MonoBehaviour { 

     public int price; 
     public Button buyBee1; 

     void OnEnable() 
     { 
      //Register Button Events 
      buyBee1.onClick.AddListener (() => buySkin (buyBee1)); 

     } 


     public void buySkin(Button button) 
     { 
      if (BeeCoinScore.coin >= price) { 
       BeeCoinScore.coin -= price; 
       buyBee1.interactable = false; 

      } 

      if (BeeCoinScore.coin < price) { 
       buyBee1.interactable = false; 
      } 
     } 

     void OnDisable() 
     { 
      //Un-Register Button Events 
      buyBee1.onClick.RemoveAllListeners(); 

     } 
    } 

ответ

1

Попробуйте это с некоторыми префабами!

using UnityEngine; 
using UnityEngine.UI; 
using System.Collections; 
using System.Collections.Generic; 

public class GameController : MonoBehaviour 
{ 

    public int coins; 
    private int spherePrice = 100, cubePrice = 50; 

    public GameObject player; 
    public GameObject[] availablePrefabs; 
    public List<GameObject> mySkins; 

    public Button btnSphere, btnCube; 
    public Text txtSphere, txtCube; 

    void Start() 
    { 
     string serializedMySkins = PlayerPrefs.GetString ("skins", ""); 
     string serializedPlayer = PlayerPrefs.GetString ("player", ""); 

     // skins desserialization 
     if (serializedMySkins == "") 
      mySkins = new List<GameObject>(); 
     else { 
      var a = serializedMySkins.Split (','); 
      for (int i = 0; i < a.Length; i++) { 
       if (a [i] == "Sphere") { 
        mySkins.Add (availablePrefabs [0]); 
       } 

       if (a [i] == "Cube") { 
        mySkins.Add (availablePrefabs [1]); 
       } 
      } 
     } 

     // player desserialization 
     if (serializedPlayer != "") { 
      if (serializedPlayer == "Sphere") { 
       player = availablePrefabs [0]; 
      } 

      if (serializedPlayer == "Cube") { 
       player = availablePrefabs [1]; 
      } 
     } else { 
      player = mySkins [0]; 
     } 

     coins = PlayerPrefs.GetInt ("coins", 0); 
     coins = 1000; 
    } 

    void Update() 
    { 
     if (mySkins.Contains (availablePrefabs [0])) { 
      txtSphere.text = "Usar esfera"; 
     } else { 
      btnSphere.interactable = coins >= spherePrice; 
     } 

     if (mySkins.Contains (availablePrefabs [1])) { 
      txtCube.text = "Usar cubo"; 
     } else { 
      btnCube.interactable = coins >= cubePrice; 
     } 
    } 

    public void play() 
    { 
     player = (GameObject)Instantiate (player, new Vector2 (0, 0), Quaternion.identity); 
    } 

    public void verifySkin (GameObject skinPrefab) 
    { 
     if (mySkins.Contains (skinPrefab)) { 
      useSkin (skinPrefab); 
     } else if (coins >= priceOf (skinPrefab)) { 
      buySkin (skinPrefab, priceOf (skinPrefab)); 
     } 
    } 

    public void buySkin (GameObject skinPrefab, int price) 
    { 
     mySkins.Add (skinPrefab); 
     coins -= price; 

     string skinsHash = ""; 
     for (int i = 0; i < mySkins.Count; i++) { 
      skinsHash += mySkins [i].name + ","; 
     } 

     Debug.Log (skinsHash); 

     PlayerPrefs.SetInt ("coins", coins); 
     PlayerPrefs.SetString ("skins", skinsHash); 

     PlayerPrefs.Save(); 
    } 

    public void useSkin (GameObject skinPrefab) 
    { 
     player = skinPrefab; 
     PlayerPrefs.SetString ("player", player.name); 
     PlayerPrefs.Save(); 
    } 

    private int priceOf (GameObject skinPrefab) 
    { 
     if (skinPrefab == availablePrefabs [0]) 
      return spherePrice; 
     else if (skinPrefab == availablePrefabs [1]) 
      return cubePrice; 
     else 
      return 0; 
    } 
} 
+1

Я думаю, что вышеупомянутый скрипт предназначен для какого-то окна покупки, поэтому вам, вероятно, не нужно обновлять этот кадр. – yes

+0

Это не работает, когда у меня недостаточно ресурсов для покупки элемента, кнопка включена. Если у вас нет ресурсов, он должен быть отключен, пока у меня не будет достаточно ресурсов для покупки предмета. –

+0

@AlanVieiraRezende вы пробовали просто положить его в OnEnable? – yes

0

OnEnable() вызывается, когда объект становится активным. вам нужно обновить(), так как он получает каждый кадр, он будет проверять, меньше или меньше вашего значения. Цена также может быть такой.

// I think that you are making an buymenu, so you can disable and enable your menu with ui button and check money you have 


    using System.Collections; 
     using UnityEngine.UI; 

     public class BuySkin : MonoBehaviour 
    { 

      public int price; 
      public static int money;// money you have 
      public Button thisbuyBee1; 
    public void buychkr() 
    { 
    if(price>= money) 
    { 
    thisbuyBee1.interactable = false; 
    } 
    else 
    { 
    thisbuyBee1.interactable = true; 
    } 
    } 
    void Update() 
    { 
    buychkr(); 
    } 
}