Salud y daño
Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 53 de 63.
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, y lo que inflige el daño busca ese script y llama a un método en él. Aquí está el componente Health de una caja que se rompe después de tres golpes, y de unas púas que dañan a todo lo que cae sobre ellas:
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. Las púas, las balas y la lava llaman al mismo método, y solo el script Health decide qué significa 0: destruir la caja, terminar el juego o reproducir una animación de muerte. Cada script está en su propio archivo, cuyo nombre corresponde al de su clase.
GetComponent<Health>() devuelve null para los objetos que no tienen Health, como el suelo, así que las púas hacen una comprobación antes de llamar al método. 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 encuentra uno.
Desafío
IntermedioUna pistola de entrenamiento dispara a un muñeco y a un caballero con armadura. El script Shooter de la pistola está listo: las flechas izquierda y derecha la giran, y la barra espaciadora dispara una bala. Escribe los dos scripts que hacen que los impactos cuenten.
Health, en el muñeco y el caballero (el Inspector establece hp y armor):
- Un método público
TakeDamage(int amount):hpdisminuye enamountmenosarmor, pero siempre al menos en 1. - Después de cada impacto, registra el nombre del objeto y los hp restantes, como
Dummy hp: 2. - Con 0 hp o menos, destruye el objeto.
Bullet, en cada bala (el Inspector establece damage en 2):
- Cuando la bala golpee algo que tenga un componente Health, llama a su
TakeDamage(damage). - Destruye la bala sin importar lo que golpee, incluida la pared.
Pulsa Play, derriba al muñeco y al caballero, y luego pulsa Check.
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 (como mínimo 1), registra lo que queda y destruye al llegar a 0
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
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 lanzamiento2Colisiones
OnCollisionEnter¿Qué golpeé?Romper al impactarDe pie sobre el sueloRebote y fricciónFormas de los collidersRepaso: muro destructible5Proyecto: Carrera de monedas
La bola rodanteMonedas para recoger