Salud y daño
Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 55 de 71.
El daño requiere dos scripts. Un script Health está en todo lo que puede recibir daño y se encarga de sus puntos de vida; lo que inflige el daño encuentra ese script y llama a uno de sus métodos. Aquí tienes el script Health de una caja que se rompe tras tres golpes y el de unos pinchos que dañan a todo lo que cae sobre ellos:
public class Health : MonoBehaviour
{
[SerializeField] private int hp = 3;
public void TakeDamage(int amount)
{
hp -= amount;
if (hp <= 0)
{
Destroy(gameObject);
}
}
}public class Spikes : MonoBehaviour
{
void OnCollisionEnter(Collision collision)
{
Health health = collision.gameObject.GetComponent<Health>();
if (health != null)
{
health.TakeDamage(1);
}
}
}TakeDamage es public, así que otros scripts pueden llamarlo, y es el único código que modifica hp. Los pinchos, las balas y la lava llaman al mismo método, y solo el script Health decide qué significa llegar a 0: destruir la caja, terminar el juego o reproducir una animación de muerte. Cada script vive en su propio archivo, cuyo nombre coincide con el de su clase.
GetComponent<Health>() devuelve null para los objetos que no tienen Health, como el suelo, así que los pinchos comprueban antes de llamar. TryGetComponent(out Health health) realiza la búsqueda y la comprobación en una sola llamada: devuelve true y asigna un valor a health solo cuando existe un componente.
Desafío
IntermedioHaz que cada impacto cuente. Bullet está listo y llama a TakeDamage(2) cuando golpea algo.
- En
Health, completaTakeDamage(int amount): restaMathf.Max(amount - armor, 1)ahp. - Registra
name + " hp: " + hp, por ejemploDummy hp: 2. - Cuando
hp <= 0, llama aDestroy(gameObject);.
Pulsa «Jugar» y dispara al muñeco dos veces: registra Dummy hp: 2 y después desaparece. Luego pulsa «Comprobar».
Pruébalo tú mismo
using UnityEngine;
public class Health : MonoBehaviour
{
[SerializeField] private int hp = 4;
[SerializeField] private int armor = 0;
public void TakeDamage(int amount)
{
// resta amount menos armor (al menos 1), registra lo que queda y destruye al llegar a 0
}
}
Todas las lecciones de Física y jugabilidad
1Cuerpo rígido
Gravedad y masaEmpujar con AddForceSaltar con un impulsoFixedUpdate para físicaVelocidadCuerpos cinemáticosRepaso: plataforma de lanzamiento4Corrutinas
InvocarInvokeRepeating y CancelInvokeTu primera corrutinaBucles en corrutinasDetener corrutinasRepaso: cuenta regresiva10Proyecto: Escape de la arena
La arenaCazadores2Colisiones
OnCollisionEnter¿Qué golpeé?Romper al impactarDe pie sobre el sueloRebote y fricciónFormas de los collidersRepaso: muro destructible5Proyecto: Carrera de Monedas
La pelota rodanteMonedas para recoger3Disparadores
Colisionadores de tipo triggerOnTriggerEnterObjetos coleccionablesLas cajas guardan el restoZonas letalesEntrada y salidaRepaso: llave y puertaPractica por tu cuenta: Playground de Unity