Menu
CoddyTech

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.

challenge icon

Desafío

Intermedio

Una 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): hp disminuye en amount menos armor, 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
    }
}
quiz iconPonte a prueba

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