en mi juego, el jugador tiene que recoger monedas. El problema es que cuando el jugador muere y comienza un nuevo juego, la cantidad de monedas no se restablece. Por ejemplo:
comenzando un nuevo juego y recolectando 15 monedas, luego muere
comenzando un nuevo juego y la cantidad de monedas que configuré en 15, no en 0
¿¿Cómo puedo arreglar eso??
Script utilizado para mostrar la puntuación en la pantalla:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class Score : MonoBehaviour { Coin coin; void Update() { coin = FindObjectOfType<Coin>(); GetComponent<Text>().text = coin.GetScore().ToString(); }Script utilizado para agregar monedas para anotar:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Coin : MonoBehaviour { float speed = 10f; public static int score = 0; void Update() { transform.position += Vector3.left * speed * Time.deltaTime; } private void OnTriggerEnter2D(Collider2D collision) { score += 1; } public int GetScore() { return score; } }También debo decir que estaba jugando con PlayerPrefs con ese puntaje para hacer un concepto de puntaje alto, pero eliminé todos los PlayerPrefs que hice. Muchas gracias.
Esta es la línea problemática:
public static int score = 0;Una variable declarada "estática" durará tanto como el tiempo de ejecución, incluso si el objeto al que está vinculada se destruye (es un valor compartido entre todos los objetos de monedas).
Idealmente, lo haría no estático (que es lo que Unity espera).
public int score = 0;Si vuelves a crear el objeto Moneda cada vez que el jugador muere, Unity se encargará de la limpieza por ti.
Alternativamente, puede agregar un método "Restablecer" a la clase Coin...
public int GetScore() { return score; } public void Reset() { score = 0; }Respondí una pregunta que trata la estática con más detalle y puede ser de interés.
Normalmente, cuando una clase tiene variables, cada vez que crea una nueva instancia de la clase, obtiene sus propias copias de cada variable.
(Puedes crear dos clases
Animaly darles a cada una unNamediferente)Una variable
statices diferente. En lugar de que cada instancia tenga su propia copia de la variable, todas comparten la misma.Entonces, si configura
animal1.StaticName, también cambiaríaanimal2.StaticName. Más concretamente, ni siquiera necesita hacer un animal, simplemente puede configurarAnimal.StaticNamedirectamente.Entonces... Se puede leer/establecer una variable estática (y se pueden ejecutar métodos estáticos) incluso si no ha creado una instancia de la clase.
Ah, y... Si decides mantener la puntuación estática, no necesitas encontrar un objeto específico para obtener la puntuación...
void Update() { GetComponent<Text>().text = Coin.score.ToString(); }