Menu
CoddyTech

Componentes abstratos

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

Algumas classes base descrevem um tipo de coisa que nunca existe por si só. Toda arma dispara, mas uma arma que não é nem uma pistola nem uma espingarda não tem como disparar. Marque essa classe como abstract e declare cada etapa que suas subclasses devem implementar como um método abstrato, sem corpo:

public abstract class Weapon : MonoBehaviour
{
    public int shots;

    public void Pull()
    {
        shots++;
        Fire();
    }

    protected abstract void Fire();
}
public class Shotgun : Weapon
{
    public GameObject pelletPrefab;

    protected override void Fire()
    {
        for (int i = -1; i <= 1; i++)
        {
            Instantiate(pelletPrefab, transform.position + transform.right * i * 0.3f, transform.rotation);
        }
    }
}

Uma subclasse que não implementa Fire não compila: CS0534, 'Pistol' does not implement inherited abstract member 'Weapon.Fire()'. A Unity também se recusa a adicionar um script abstrato a um objeto. Arraste Weapon para um objeto e ela exibirá Can't add script behaviour 'Weapon'. The script class can't be abstract!, pois a Unity não poderia criar uma Weapon sem Fire.

Outros scripts continuam funcionando com o tipo base. GetComponent<Weapon>() retorna a subclasse que estiver no objeto, e Pull() executa o Fire dessa subclasse:

// Player.cs
private Weapon weapon;

void Start()
{
    weapon = GetComponent<Weapon>();
}

void Update()
{
    if (Mouse.current.leftButton.wasPressedThisFrame)
    {
        weapon.Pull();
    }
}

Troque o componente Shotgun por um Pistol e o script Player continuará igual.

challenge icon

Desafio

Fácil

A torre do mago dispara raios contra os monstros no campo. Monster.cs contém o que todos os monstros têm em comum: hp (3) e Zap(), que tira 1 hp, destrói o monstro quando chega a 0 e, caso contrário, chama React(). Slime.cs reage encolhendo. Imp.cs não tem reação, e Monster fornece a ele um React vazio, então nada indica que isso está faltando.

  • Torne Monster abstrata e React um método abstrato, para que um monstro que não especifica como reage não compile. Então, o compilador aponta para Imp.
  • Escreva o React de Imp: ele salta 2 unidades para trás, para longe da torre (ao longo de +z).
  • Em Tower.cs, quando a tecla Space for pressionada, obtenha o componente Monster de cada objeto marcado com a tag Monster, seja qual for o tipo, e aplique Zap() a ele.

Pressione Play e dispare raios contra os monstros; em seguida, clique em Check.

Experimente você mesmo

using UnityEngine;

// O que todos os monstros têm em comum.
public class Monster : MonoBehaviour
{
    public int hp = 3;

    public void Zap()
    {
        hp--;
        if (hp <= 0)
        {
            Destroy(gameObject);
        }
        else
        {
            React();
        }
    }

    // Como esse tipo de monstro reage a um choque ao qual sobrevive.
    protected virtual void React()
    {
    }
}
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