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.
Desafio
FácilA 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()
{
}
}
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
1Componentes, não hierarquias
Componentes pequenosUm script-base para inimigosComponentes abstratosComponentes trabalhando juntosRevisão: Torre modular4Dados Serializados
Classes SerializáveisListas no InspectorEnums no InspectorRevisão: Tabela de Loot7Máquinas de Estados
Estados como ClassesUma Máquina de EstadosTransiçõesInteligências dos InimigosRevisão: Estados da Porta10Projeto: Sobrevivente da Arena
O HeróiTipos de Inimigos5ScriptableObjects
Assets de dadosAtributos das armasConfigurações compartilhadasOndas como dadosRevisão: banco de dados de itens