Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

[Ayuda]Como programo una tenda

Iniciado por 0c0de, Septiembre 16, 2015, 05:15:44 PM

Tema anterior - Siguiente tema
Es decir me gustaria crear en mi juego una tienda en la que se puedan comprar diferentes vehiculos como helicopteros avionetas etc pero el problema es que no se como hacerlo osea creo que tendria que usar el PlayerPrefs pero nose como hacer (ya he usado antes playerprefs) bueno el caso es la GUI esta ya desarrollada y los botones en si funcionan es decir si le clickas te sale comprado y ya no los puedes volver a hacer click porque estan desactivados pero cuando vuelvo a la escena principal lo que he comprado no me sale os pongo el script que tengo de la tienda: 
using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class Tienda : MonoBehaviour {
public Transform textoMonedas;
public Button myboton;
public Transform textoHelicoptero;
[HideInInspector] public bool CompradoHeli = false;
public Coins coin;
[HideInInspector] public int valorHelicoptero = 1;
void Start () {


}

// Update is called once per frame
void Update () {
   textoMonedas.GetComponent<TextMesh>().text = coin.valor.ToString();
   coin.SvedMoney ();
}

public void Helicoptero(){

   if (coin.valor >= valorHelicoptero) {
      CompradoHeli = true;
      coin.valor -= valorHelicoptero;
      textoHelicoptero.GetComponent<TextMesh> ().text = "Comprado";
      textoHelicoptero.GetComponent<TextMesh> ().fontSize = 30;
   }

   if (CompradoHeli = true) {
      myboton.enabled = false;
   } else {
      myboton.enabled = true;
   }
}
}

Si, tienes que usar PlayerPrefs En el codigo cuando compras el helicoptero añade otra lineaPlayerPrefs.SetInt("Helicoptero", 1);Esto lo que hara es crear una variable accesible mediante el metodo PlayerPrefs.GetInt(string); entonces en el script que tengas para ver lo que tienes comprado añade
if(PlayerPrefs.GetInt("Helicoptero") == 0){
    Debug.Log("El helicoptero esta comprado");
}

Muchas gracias jose el concepto funciona lo tendre que modificar pero la idea esta ahi  siempre me hago un lio con playerprefs seran pocas funciones pero me lio yo solo jajaja

Septiembre 16, 2015, 09:53:49 PM #3 Ultima modificación: Septiembre 16, 2015, 11:01:10 PM por kaito
PlayerPrefs guarda los datos en el archivo de registro de windows(si utilizas windows).  En lugar de usar el archivo de registro para guardar los datos de un inventario o una tienda utilizaría un Dictionary<string,int>.Un ejemplo práctico de guardar un Dictionary en un archivo de texto: 
using UnityEngine;
using System.Collections.Generic;


public class SaveLoadDictionary : MonoBehaviour {

[System.Serializable]
public class Data{

   public string name;
   public int value;

}

public Data[] Save;
public Data[] Load;

Dictionary<string,int> dictionary;

void Start(){

   this.dictionary = new Dictionary<string, int>();
   foreach(Data data in Save) this.dictionary.Add(data.name,data.value);
   SaveDictionary(this.dictionary,"data.txt");
   this.Load = LoadDictionary("data.txt");
   //foreach(Data data in Load) this.dictionary.Add(data.name,data.value);

}

void SaveDictionary(Dictionary<string,int> dictionary,string file){

   var File = System.IO.File.CreateText(Application.dataPath+"/"+file);
   foreach (var entry in dictionary) File.WriteLine("{0} {1}", entry.Key, entry.Value);
   File.Close(); //Cerrar para liberar archivo

}

Data[] LoadDictionary(string file){

   List<Data> list = new List<Data>();

   string[] lines = System.IO.File.ReadAllLines(Application.dataPath+"/"+file);
   //El archivo se cierra-libera automaticamente

   foreach(string line in lines){

      string[] data = line.Split(' ');
      list.Add(new Data(){name = data[0], value = System.Int32.Parse(data[1])});

   }

   return list.ToArray();

}

}
 

Vale todo funciona OK en el pc tienda monedas aviones pero en android no me guarda las monedas es decir es como si no las añadiese a la variable monedas
//Este es el principal el que hace que cuando muera escriba la variable con las monedas recogidas
  public void OnCollisionEnter2D(Collision2D other)
    {
   Reset.gameObject.SetActive(true);
   Ventanilla.gameObject.SetActive (true);
   Music.gameObject.SetActive(true);
   GameOver.gameObject.SetActive(true);
   Instantiate(Explosion, avion.transform.position, avion.transform.rotation);
   Destroy (Explosion, 1f);
   GestorAviones.AvionetaPrincipal.GetComponent<SpriteRenderer> ().enabled = false;
   GestorAviones.Helicoptero.GetComponent<SpriteRenderer> ().enabled = false;
   GestorAviones.NyanCat.GetComponent<SpriteRenderer>().enabled = false;

   if (PlayerPrefs.HasKey ("coins")) {
      PlayerPrefs.SetInt("coins", GetComponent<Coins>().valor);
   }
    }

    public void Die()
    {
   if (PlayerPrefs.HasKey ("coins")) {
      PlayerPrefs.SetInt("coins", GetComponent<Coins>().valor);
   }

   if (PlayerPrefs.HasKey ("highscore")) {
      if (PlayerPrefs.GetInt ("highscore") < GetComponent<PointsScore>().score) {
         PlayerPrefs.SetInt ("highscore", GetComponent<PointsScore>().score);
         PlayerPrefs.Save();
      }
   } else {
      PlayerPrefs.SetInt("highscore", GetComponent<PointsScore>().score);
   }
        Application.LoadLevel(0);
    }
 
//Este es el que se encarga de asignar la variable y cargar las monedas
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class Coins : MonoBehaviour {

public Image coin;
public GameObject textoMonedas;
[HideInInspector]public int valor;
// Use this for initialization
void Start () {
   SvedMoney ();
   coin.gameObject.SetActive (true);
   textoMonedas.GetComponent<TextMesh>().text = valor.ToString();

}

// Update is called once per frame
void Update () {

}

void OnTriggerEnter2D(Collider2D other){
   if (other.gameObject.tag == "Check" && coin.enabled) {
      coin.gameObject.SetActive(false);
      IncrementarMonedas();
      StartCoroutine(MyMethod());
   }
}

public void IncrementarMonedas(){
   valor = valor+1;
   textoMonedas.GetComponent<TextMesh> ().text = valor.ToString ();
}

public void SvedMoney(){
   if (Application.loadedLevel == 0 || Application.loadedLevel == 1 && PlayerPrefs.HasKey ("coins")) {
      if (PlayerPrefs.HasKey ("coins")) {
         valor = PlayerPrefs.GetInt ("coins");
         textoMonedas.GetComponent<TextMesh> ().text = valor.ToString ();
      }
   }
}

public IEnumerator MyMethod(){
   yield return new WaitForSeconds (1f);
   coin.gameObject.SetActive (true);
}
}
 

Etiquetas: