Menu
CoddyTech

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.

challenge icon

Desafío

Intermedio

Haz que cada impacto cuente. Bullet está listo y llama a TakeDamage(2) cuando golpea algo.

  1. En Health, completa TakeDamage(int amount): resta Mathf.Max(amount - armor, 1) a hp.
  2. Registra name + " hp: " + hp, por ejemplo Dummy hp: 2.
  3. Cuando hp <= 0, llama a Destroy(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

Practica por tu cuenta: Playground de Unity