Menu
CoddyTech

IDamageable

Parte da seção Arquitetura de jogos no Unity do Journey de Unity da Coddy. Lição 6 de 50.

Muitas coisas em um jogo podem sofrer dano, e elas têm pouca coisa em comum: o jogador tem pontos de vida, uma caixa quebra com o primeiro golpe. Uma classe base compartilhada as forçaria a pertencer à mesma família. Uma interface nomeia a única coisa que elas têm em comum, e cada script a implementa à sua maneira:

public interface IDamageable
{
    void TakeDamage(int amount);
}
public class PlayerHealth : MonoBehaviour, IDamageable
{
    public int hp = 10;

    public void TakeDamage(int amount)
    {
        hp -= amount;
        Debug.Log("Ouch! hp: " + hp);
    }
}
public class Crate : MonoBehaviour, IDamageable
{
    public void TakeDamage(int amount)
    {
        Destroy(gameObject);
    }
}

Um script ainda tem uma classe base, MonoBehaviour, e lista as interfaces depois dela. A interface fica em um arquivo próprio, IDamageable.cs, e não deriva de MonoBehaviour: ela não é um componente e nunca é adicionada a um objeto sozinha. Uma classe que a lista precisa ter um método público TakeDamage(int), ou não compila.

O que causa o dano pede a interface, não uma classe:

// Fireball.cs
void OnCollisionEnter(Collision collision)
{
    IDamageable target = collision.gameObject.GetComponent<IDamageable>();
    if (target != null)
    {
        target.TakeDamage(3);
    }
    Destroy(gameObject);
}

A bola de fogo causa dano ao jogador e quebra caixas com as mesmas linhas, e um tipo de alvo adicionado mais tarde não exige nenhuma mudança aqui. O Unity não mostra no Inspector um campo de tipo interface, então os scripts guardam um GameObject ou um componente e pedem a ele a interface, como a bola de fogo faz.

challenge icon

Desafio

Fácil

Um gigante está guardando a praça da vila. As teclas de seta movimentam o gigante (Mover.cs, pronto), e a barra de espaço balança seu martelo: Hammer.cs chama Slam(), que encontra todos os colisores dentro de radius. Três coisas na praça recebem um golpe, cada uma à sua maneira, e não compartilham mais nada:

  • Snowman: cada ponto de dano reduz 0.25 do tamanho em cada eixo (ele começa em 1.5). Com tamanho de 0.5 ou menos, ele derrete: destrua o boneco de neve.
  • Bell: registra Dong uma vez por ponto de dano (um golpe de 2 registra duas vezes) e adiciona os pontos a rings.
  • Scarecrow: o primeiro golpe o derruba, girando-o 90 graus em torno de z, independentemente do dano. Golpes posteriores não mudam nada.

IDamageable.cs declara a interface, com um método: void TakeDamage(int amount). Faça Snowman, Bell e Scarecrow implementarem essa interface, cada um com sua própria reação. Em seguida, em Slam, chame TakeDamage(power) no IDamageable de cada colisor encontrado. Colisores sem um, como o chão, são ignorados.

Pressione Play, aproxime-se de cada um e golpeie; depois, Check.

Experimente você mesmo

using UnityEngine;

public class Snowman : MonoBehaviour
{
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Arquitetura de jogos no Unity