jairogarcíarincón

Game Manager


7.51K

Crear Asteroides

Vamos a crear el Game Manager de nuestro juego, que será el responsable de iniciar y terminar el juego, llevar los contadores y crear los objetos tales como asteroides y otros enemigos.

  • Crea un Empty Object llamado Game Manager
  • Resetea su posición
  • Crea un nuevo script GameManager y asócialo al objeto Game Manager



using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameManager : MonoBehaviour {

public GameObject asteroide;
public Vector3 posicion;

void Start () {

crearAsteroide();

}

void crearAsteroide()
{
//Posición aleatoria entre los límites (positivo y negativo) que establezcamos
Vector3 posicionAsteroide = new Vector3(Random.Range(-posicion.x, posicion.x), posicion.y, posicion.z);
//Rotación
Quaternion rotacionAsteroide = Quaternion.identity;
//Instancio el asteroide
Instantiate(asteroide, posicionAsteroide, rotacionAsteroide);
}
}


Ajusta la variable Posición en la Inspector window del Game Manager (en el script) a XYZ 6, 0, 16.
Asocia el Prefab Asteroides a la variable Asteroide.

De esta forma ya tendríamos la lógica para que al arrancar el juego se cree un asteroide.

Modifica ahora el código anterior para que se vayan creando "olas" de asteroides cada cierto tiempo durante todo el ciclo de vida del juego:


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameManager : MonoBehaviour {

public GameObject asteroide; //objeto a instanciar
public Vector3 posicion; //posición (límites) en la que instanciar
public int numeroDeAsteroides; //número de objetos en cada ola
public float esperaInicial;
public float esperaEntreAsteroides;
public float esperaEntreOlas;

void Start () {

StartCoroutine(crearAsteroides());

}

IEnumerator crearAsteroides(){

//Espera inicial
yield return new WaitForSeconds(esperaInicial);

while (true){

for (int i = 0; i < numeroDeAsteroides; i++)
{
//Posición aleatoria entre los límites (positivo y negativo) que establezcamos
Vector3 posicionAsteroide = new Vector3(Random.Range(-posicion.x, posicion.x), posicion.y, posicion.z);
//Rotación
Quaternion rotacionAsteroide = Quaternion.identity;
//Instancio el asteroide
Instantiate(asteroide, posicionAsteroide, rotacionAsteroide);
//Espera entre asteroides
yield return new WaitForSeconds(esperaEntreAsteroides);
}

//Espera entre olas
yield return new WaitForSeconds(esperaEntreOlas);

}

}
}


En la Inspector window, ajusta Número de Asteroides a 10, Espera Inicial a 0.5, Espera Entre Asteroides a 1 y Espera Entre Olas a 4.


Destruir las explosiones

Si bien nuestros Asteroides se destruyen bien porque les disparamos o bien porque se salen de los límites, vemos al probar el juego que sus explosiones se quedan en la Hierarchy window, lo que podría generar problemas cuando sean muchas.

Para que se destruyan al cabo de un tiempo, genera un nuevo script llamado DestruirPorTiempo y asócialo a los Prefabs explosion_asteroid y explosion_player (dentro de Assets > Prefabs >VFX > Explosions) con un Tiempo de Vida de 2 (segundos):


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DestruirPorTiempo : MonoBehaviour {

public float tiempoDeVida;

void Start () {

//destruyo el objeto después de un tiempo de vida
Destroy(gameObject, tiempoDeVida);

}

}



Publicado el 30 de Enero de 2025

unityspace shooter