2016-05-10 3 views
0

Ich versuche, eine einfache Bedingung zu machen:Interactable Taste UNITY

Wenn der Wert ich habe, weniger als der Preis ist es das Element kostet, ist die Schaltfläche deaktiviert.

Wenn der Wert, den ich habe, größer oder gleich dem Preis ist, den es kostet, ist die Schaltfläche aktiviert und ich kann sie kaufen.

Aber wenn ich teste, habe ich ein paar Probleme.

Erstens, wenn ich weniger als die Artikelkosten habe, ist die Schaltfläche aktiviert, und nur wenn ich darauf klicke, ist es, wenn es deaktiviert.

Zweitens, wenn ich weniger als die Artikelkosten habe und ich auf es klicke es deaktiviert, aber wenn ich genug bekomme, um das Element zu kaufen, ist die Schaltfläche nicht wieder aktiviert.

Wie kann ich diese Variablen die ganze Zeit überprüft werden? Wenn ich genug habe, ist die Schaltfläche aktiviert, wenn sie nicht deaktiviert ist.

Bellow mein Scrip:

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(); 

     } 
    } 

Antwort

1

dieses Versuchen mit einigen prefabs out!

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

Ich denke, das obige Skript ist für eine Art von Kauf Fenster, so dass Sie wahrscheinlich nicht aktualisieren müssen, dass jeder Rahmen. – yes

+0

Es funktioniert nicht, wenn ich nicht genügend Ressourcen zum Kauf des Artikels habe, ist die Schaltfläche aktiviert. Wenn Sie keine Ressourcen haben, sollte es deaktiviert werden, bis ich genug Ressource habe, um das Element zu kaufen. –

+0

@AlanVieiraRezende hast du versucht es einfach in OnEnable zu setzen? – yes

0

OnEnable() wird aufgerufen, wenn das Objekt aktiviert und aktiv wird. Sie müssen Update(), wie es in jedem Rahmen aufgerufen wird, wird es überprüfen, ob Ihr Wert ist kleiner oder höher als der Preis des Artikels. Sie können auch so versuchen.

// 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(); 
    } 
}