Estoy tratando de crear una tienda en otra escena. Puedes acceder a él en cualquier momento mientras juegas presionando H. Mi problema es que las monedas que el jugador ha recolectado no se guardan. He estado tratando de buscar respuestas, pero nada parece ayudar.
Los Códigos: Mi Código Global que uso para guardar variables:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Global : MonoBehaviour { public static Global Instance; public int sumCoins; void Awake(){ if (Instance == null){ DontDestroyOnLoad(gameObject); Instance = this; } else if (Instance != this){ Destroy(gameObject); } } }El código que uso para comprar artículos:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class Shop : MonoBehaviour { public Button milk; void Start() { Debug.Log("you have " + Global.Instance.sumCoins); milk.onClick.AddListener(AddMilk); } void AddMilk(){ Debug.Log("You bought milk"); //if player has more than 5 coins. //add milk //else if player has less than 5 coins //display "You cant buy this" //else if player doesnt have a slot available //display "You cant buy this" } }El código que se usa para contar y sumar monedas:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class Coinsystem : MonoBehaviour { public int sumCoins = 0; private int addedCoins; int coins; Text txt; public GameObject count; public void Start(){ Debug.Log("coin system working"); txt = count.GetComponent<Text>(); txt.text = "" + sumCoins; sumCoins = Global.Instance.sumCoins; } public void Update(){ txt.text = "" + sumCoins; } public void AddCoins(int addedCoins){ sumCoins += addedCoins; Debug.Log("Coins Added!"); } public void SaveMoney(){ Global.Instance.sumCoins = sumCoins; } }¡Gracias por tomarte tu tiempo para leer esto!
Una forma rápida de resolver este problema sería usar una clase estática. A veces he usado este método para conservar los datos a lo largo de la vida útil de la aplicación.
public static class GameData { private static int coins = 0; public static void SetCoins(int coinsIn) { coins = coinsIn; } public static void AddCoins(int coinsIn) { coins += coinsIn; } public static int GetCoins() { return coins; } }Entonces puedes simplemente llamar a los métodos de esta manera:
GameData.SetCoins(...); GameData.AddCoins(...); var coins = GameData.GetCoins();La otra forma en que las personas resuelven este problema es la siguiente:
PlayerPrefs , similar al uso de una clase estática. Descubra más sobre eso aquí .DontDestroyOnLoad . Descubra más sobre eso aquí .Normalmente no recomendaría el uso de clases estáticas porque generalmente es una mala práctica de programación, pero a veces es necesario sortear limitaciones como esta.
Generalmente, como regla general, si va a utilizar una clase estática, suele haber una mejor manera de hacerlo.
Probablemente diría que la forma más preferida sería Guardar/Cargar los datos hacia y desde el almacenamiento local cuando sea necesario, pero este enfoque es demasiado para lo que desea hacer.