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.
Desafio
FácilUm 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: registraDonguma vez por ponto de dano (um golpe de 2 registra duas vezes) e adiciona os pontos arings.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
{
}
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