Menu
CoddyTech

Vida e dano

Parte da seção Física e Jogabilidade do Journey de Unity da Coddy. Lição 55 de 71.

O dano envolve dois scripts. Um script Health fica em tudo que pode ser ferido e controla seus pontos de vida, e aquilo que causa o dano encontra esse script e chama um método nele. Aqui está o Health de uma caixa que quebra após três golpes e de espinhos que ferem qualquer coisa que caia sobre eles:

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 é public, então outros scripts podem chamá-lo, e é o único código que altera hp. Espinhos, balas e lava chamam o mesmo método, e somente o script Health decide o que 0 significa: destruir a caixa, encerrar o jogo ou reproduzir uma animação de morte. Cada script fica em seu próprio arquivo, com o nome de sua classe.

GetComponent<Health>() retorna null para coisas que não têm Health, como o chão, então os espinhos verificam antes de chamar. TryGetComponent(out Health health) faz a busca e a verificação em uma única chamada: retorna true e preenche health somente quando há um.

challenge icon

Desafio

Médio

Faça os acertos valerem. Bullet está pronto e chama TakeDamage(2) no que atingir.

  1. Em Health, preencha TakeDamage(int amount): subtraia Mathf.Max(amount - armor, 1) de hp.
  2. Registre name + " hp: " + hp, por exemplo Dummy hp: 2.
  3. Quando hp <= 0, chame Destroy(gameObject);.

Pressione “Jogar” e atire no boneco duas vezes: ele registra Dummy hp: 2 e, em seguida, desaparece. Depois, pressione “Verificar”.

Experimente você mesmo

using UnityEngine;

public class Health : MonoBehaviour
{
    [SerializeField] private int hp = 4;
    [SerializeField] private int armor = 0;

    public void TakeDamage(int amount)
    {
        // reduza hp em amount menos armor (no mínimo 1), registre quanto resta e destrua ao chegar a 0
    }
}

Todas as lições de Física e Jogabilidade

Pratique por conta própria: Playground de Unity