jairogarcíarincón
29/07/2018
Contenidos
En esta sección crearemos las bombas que después podrá lanzar nuestro tanque.
Las acciones a realizar son:
- Encontrar los tanques afectados
- Aplicar el daño a esos tanques
- Aplicar la fuerza del daño a a esos tanques
- Reproducir el sonido y el sistema de partículas
- Borrar los objetos sobrantes (partículas, etc.)
Para ello:
- Arrastra el modelo Shell desde Models hasta la Hierarchy window
- Añade una Capsule Collider a Shell
- Selecciona Is Trigger en la Capsule Collider
- Ajusta la Direction a Z-Axis, el Center a 0, 0, 0.2, el Radius a 0.15 y Height a 0.55.
- Añade un Rigidbody a Shell.
- Arrastra el prefab ShellExplosion al objeto Shell.
- Añade un AudioSource a ShellExplosion.
- Usa el círculo selector para escoger el AudioClip ShellExplosion.
- Deselecciona Play OnAwake.
- Selecciona Shell y añádele un Light Component.
- Arrastra el script ShellExplosion desde Scripts > Shell al objeto Shell y ábrelo.
- El código deberá ser similar a este y deberías intentar entenderlo mediante los comentarios:
using UnityEngine;
public class ShellExplosion : MonoBehaviour
{
public LayerMask m_TankMask; //Usado para filtrar a qué afecta la explosión de la bomba. Debería ajustarse a "Players"
public ParticleSystem m_ExplosionParticles; //Referencia a las partículas que se reproducirán en la explosión
public AudioSource m_ExplosionAudio; //Referencia al audio que se reproducirá en la explosión
public float m_MaxDamage = 100f; //Cantidad de daño si la explosión está centrada en el tanque
public float m_ExplosionForce = 1000f; //Cantidad de fuerza añadida al tanque en el centro de la explosión
public float m_MaxLifeTime = 2f; //Tiempo de vida en segundos de la bomba
public float m_ExplosionRadius = 5f; //Radio máximo desde la explosión para calcular los tanques que se verán afectados
private void Start()
{
//Si no se ha destruido aún, destruir la bomba después de su tiempo de vida
Destroy(gameObject, m_MaxLifeTime);
}
private void OnTriggerEnter(Collider other)
{
// Recoge los colliders en una esfera desde la posición de la bomba con el radio máximo.
Collider[] colliders = Physics.OverlapSphere (transform.position, m_ExplosionRadius, m_TankMask);
// Recorro los colliders
for (int i = 0; i < colliders.Length; i++)
{
// Selecciono su Rigidbody.
Rigidbody targetRigidbody = colliders[i].GetComponent<Rigidbody> ();
// SI no tienen, paso al siguiente.
if (!targetRigidbody)
continue;
// Añado la fiuerza de la explosión.
targetRigidbody.AddExplosionForce (m_ExplosionForce, transform.position, m_ExplosionRadius);
// Busco el script TankHealth asociado con el Rigidbody.
TankHealth targetHealth = targetRigidbody.GetComponent<TankHealth> ();
// SI no hay script TankHealth, paso al siguiente.
if (!targetHealth)
continue;
// Calculo el daño a aplicar en función de la distancia a la bomba.
float damage = CalculateDamage (targetRigidbody.position);
// Aplico el daño al tanque.
targetHealth.TakeDamage (damage);
}
// Desacnlo el sistema de aprticulas de la bomba.
m_ExplosionParticles.transform.parent = null;
// Reproduczco el sistema de pertículas.
m_ExplosionParticles.Play();
// Reproduzco el audio.
m_ExplosionAudio.Play();
// Cuando las partículas han terminado, destruyo su objeto asociado.
Destroy (m_ExplosionParticles.gameObject, m_ExplosionParticles.main.duration);
// Destruyo la bomba.
Destroy (gameObject);
}
private float CalculateDamage(Vector3 targetPosition)
{
// Creo un vector desde la bomba al objetivo.
Vector3 explosionToTarget = targetPosition - transform.position;
// Calculo la distancia desde la bomba al objetivo.
float explosionDistance = explosionToTarget.magnitude;
// Calculo la proporción de máxima distancia (radio máximo) desde la explosión al tanque.
float relativeDistance = (m_ExplosionRadius - explosionDistance) / m_ExplosionRadius;
// Calculo el daño a esa proporción.
float damage = relativeDistance * m_MaxDamage;
// Me aseguro de que el mínimo daño siempre es 0.
damage = Mathf.Max (0f, damage);
//Devuelvo el daño
return damage;
}
}
Las siguientes figuras muestran el efecto causado por la bomba según el radio máximo y la posición del tanque respecto de la explosión:
Fuente: Unity
Fuente: Unity
Con el objeto Shell seleccionado, vamos a asociar los objetos a las variables de nuestro script:
- Arrastra el objeto hijo ShellExplosion a las variables Explosion Particles y Explosion Audio del script.
- Ajusta la variable Tank Mask a Players.
- Arrastra el objeto Shell a la carpeta Prefabs para guardarlo y bórralo de la Hierarchy window.
- Guarda la escena.
Publicado el 30 de Enero de 2025
Unity2dortográfico