Soy nuevo en Unity como un todo y decidí crear un pequeño y simple juego de serpientes como prueba. Me las arreglé para crear movimiento, el problema ahora es que quiero comerme la manzana primero, luego esperar hasta que me coma la manzana y luego generar una nueva.
Hasta ahora logré hacer que esperara hasta que como la primera manzana, pero luego genera muchas manzanas a la vez, ¿cómo puedo hacer que espere hasta que como la manzana, luego genera una manzana y luego otra manzana hasta ahora y adelante.
Hice solo 1 desove de manzana en una ubicación determinada hasta ahora porque quería probarlo antes de desovar en otra ubicación.
Aquí está el código que tengo hasta ahora
void OnTriggerEnter2D(Collider2D other) { Destroy(gameObject); } public void checkApple() { if (GameObject.Find("Apple")) { Debug.Log("The apple has not been eaten"); } else { Debug.Log("The apple has been eaten!"); GameObject a = Instantiate(Apple) as GameObject; a.transform.position = new Vector2(-10.26f, 3.66f); } } void Update() { checkApple(); }Si bien existen mejores métodos para manejar su problema que buscar en toda la escena el nombre de un objeto, una solución a su problema se vería de la siguiente manera: Actualmente, crea una instancia de un nuevo Objeto después de destruir el anterior, mientras que su prefabricado u objeto podría llamarse "Apple", la nueva Instancia se llamará "Apple(Clone)" y como solo está buscando el objeto que se llama "Apple" y no un objeto que contiene el nombre Apple, nunca encontrará un objeto.
Para evitarlo, deberá establecer el nombre del objeto recién creado. Para eso solo necesitas renombrar el objeto creado
if (GameObject.Find("Apple")) { Debug.Log("The apple has not been eaten"); } else { Debug.Log("The apple has been eaten!"); GameObject a = Instantiate(Apple) as GameObject; a.name = "Apple"; a.transform.position = new Vector2(-10.26f, 3.66f); }Sin embargo, si su objetivo final es "crear una nueva manzana en una nueva posición", sería mejor simplemente mover el objeto a la nueva posición cuando su serpiente choca con la manzana, si no quiere que la manzana aparezca instantáneamente, puede crear un temporizador de enfriamiento algo como esto:
void OnTriggerEnter2D(Collider2D other) { //when needed make sure that the snake only eats apples //if(other.name.Equals("Apple")){ //for a random position you could use // Apple.transform.position = new Vector2(Random.Range(-10.0f, 10.0f),Random.Range(-10.0f, 10.0f)); Apple.transform.position = new Vector2(-10.26f, 3.66f); Apple.SetActive(false); cooldown = 2f; inactiveApple = true; //} } public void checkApple() { cooldown -= Time.deltaTime; if(cooldown <= 0 && inactiveApple) { Apple.SetActive(true); inactiveApple = false; } }Por supuesto, al final, primero deberá verificar si la nueva posición está ocupada por la serpiente antes de generarla allí, pero eso está fuera de tema.
Puede usar invocar para esperar;
float waitingTime = 1f; void Start() { Spawn(); } void OnTriggerEnter2D(Collider2D other) { Destroy(gameObject); Invoke("Spawn", waitingTime); } void Spawn() { Debug.Log("The apple has been spawned!"); GameObject a = Instantiate(Apple) as GameObject; a.transform.position = new Vector2(-10.26f, 3.66f); }