jairogarcíarincón

Los asteroides


7.51K

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.


Publicado el 30 de Enero de 2025

unityspace shooter