Vida e dano
Parte da seção Física e jogabilidade do Journey de Unity da Coddy. Lição 53 de 63.
O dano envolve dois scripts. Um script Health fica em tudo que pode sofrer dano e controla seus pontos de vida, e o 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 causam dano a tudo que cai 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 ele é 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, nomeado de acordo com sua classe.
GetComponent<Health>() retorna null para objetos 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 componente.
Desafio
MédioUma arma de treinamento dispara contra um boneco e um cavaleiro blindado. O script Shooter na arma está pronto: as setas para a esquerda e para a direita a giram, e a barra de espaço dispara uma Bullet. Escreva os dois scripts que fazem os acertos valerem.
Health, no Dummy e no Knight (o Inspector define hp e armor):
- Um método público
TakeDamage(int amount):hpdiminui emamountmenosarmor, mas sempre em pelo menos 1. - Após cada acerto, registre o nome do objeto e o hp restante, como
Dummy hp: 2. - Com 0 hp ou menos, destrua o objeto.
Bullet, em cada bala (o Inspector define damage como 2):
- Quando a bala acertar algo que tenha um Health, chame seu
TakeDamage(damage). - Destrua a bala, independentemente do que ela atingir, inclusive a parede.
Pressione Play, derrube o boneco e o cavaleiro e, em seguida, Check.
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 o hp em amount menos armor (no mínimo 1), registre o que restou e destrua ao chegar a 0
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Física e jogabilidade
1Rigidbody
Gravidade e MassaEmpurrar com AddForcePular com um ImpulsoFixedUpdate para FísicaVelocidadeCorpos CinemáticosRevisão: Plataforma de Lançamento2Colisões
OnCollisionEnterO que eu acertei?Quebre no impactoNo chãoQuique e atritoFormas dos collidersRevisão: Parede destrutível5Projeto: Corrida das Moedas
A Bola RolanteMoedas para Coletar