Contenido

Los asteroides

Los asteroides

De la misma manera que hicimos con los disparos, a crear un Prefab de un asteroide para poder instanciarlo cuando sea necesario:
  • Crea un Empty Object y llámalo Asteroides
  • Resetea su posición y ajusta Position Z a 8
  • Arrastra dentro de Asteroides el objeto Assets > Models > prop_asteroid_01
  • Resetea su posición
  • Añade al objeto Asteroides un Rigidbody y un Capsule Collider
  • Desactiva Use Gravity y asigna Angular Drag (resistencia a la rotación) a 0 en el Rigidbody
  • Ajusta el Capsule Collider al objeto desde la Scene view o mediante Height y Radius.
  • Crea un nuevo script dentro de Assets > Scripts llamado RotadorAleatorio con el siguiente código y añadelo al objeto Asteroides:

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

public class RotadorAleatorio : MonoBehaviour {

    //Para establecer la máxima caída
    public float caida = 5;

	void Start () {

        //Velocidad angular o de rotación = valor alaatorio en una esfera de radio 1 * la caida
        GetComponent<Rigidbody>().angularVelocity = Random.insideUnitSphere * caida;

	}

}
De este modo tendríamos el asteroide rotando de forma aleatoria.

Disparando al asteroide

Para que cuando disparemos se destruyan tanto el disparo como el asteroide, debemos hacer algunos cambios:
  • Activa la propiedad Is Trigger en el objeto Asteroides
  • Crea un script llamado DestruirPorContacto con el siguiente código y asócialo a Asteroides:

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

public class DestruirPorContacto : MonoBehaviour {

    //Al entrar en el objeto
    private void OnTriggerEnter(Collider other)
    {
        //Para que no se destruya con los límites
        if (other.name != "Limites"){

            //Destruyo el disparo (con el que ha chocado)
            Destroy(other.gameObject);
            //Destruyo el asteroide
            Destroy(gameObject);
        }
    }
}

Explosiones

Modifica el script DestruirPorContacto para añadir efectos de explosiones tanto si le disparamos como si nos chocamos con él:

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

public class DestruirPorContacto : MonoBehaviour {

    public GameObject explosion;
    public GameObject explosionNave;

    //Al entrar en el objeto
    private void OnTriggerEnter(Collider other)
    {
        //Para que no se destruya con los límites
        if (other.name != "Limites"){

            //Explosión del disparo en su posición y rotación
            Instantiate(explosion, transform.position, transform.rotation);

            if (other.name == "Nave")
            {
                //Explosión de la nave en su posición y rotación
                Instantiate(explosionNave, other.transform.position, other.transform.rotation);
            }

            //Destruyo el disparo (con el que ha chocado)
            Destroy(other.gameObject);
            //Destruyo el asteroide
            Destroy(gameObject);
        }
    }
}
Para que funcione, solo debo asociar en la Inspector Window las variables Explosion y Explosion Nave con los objetos explosion_asteroid y explosion_player de la carpeta Prefabs > VFX > Explosions.

Movimiento del asteroide

Para que el asteroide se mueva hacia la Nave, bastará con asociarle un nuevo script llamado MoverAsteroide con el siguiente código y asignarle una velocidad de -5. Además, cuando alcance el límite inferior se destruirá:

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

public class MoverAsteroide : MonoBehaviour {

	//Declarlo la variable de tipo RigidBody que luego asociaremos a nuestro objeto
	private Rigidbody rb;

	//Declaro la variable pública velocidad para poder modificarla desde la Inspector window
	[Range(-1,-10)]
	public float velocidad = -5;

	void Start () {

		//Capturo el rigidbody del jugador al iniciar el juego
		rb = GetComponent<Rigidbody>();

		//Aplico movimiento en dirección z positiva (con su velocidad)
		rb.velocity = transform.forward * velocidad;

	}

}

Crear el prefab

Una vez hecho y probado todo lo anterior, arrastra el objeto Asteroides a la carpeta Assets > Prefabs y elimínalo de la Hierarchy window, ya que lo instanciaremos a través del Game Controller en el próximo apartado.