Barras de vida
Lição 22 de 25 do curso Jogo de Unity: Defesa de Torres da Coddy.
Uma barra sobre cada inimigo mostra quanta vida ainda resta. No prefab do inimigo, ela é composta por dois cubos finos: um fundo escuro e um preenchimento verde à sua frente. A largura do preenchimento é a vida restante dividida pela vida total, um número de 0 a 1, e multiplicar por ele a escala x do preenchimento faz com que ele fique mais curto. Um cubo, porém, é escalado em torno do centro, então o preenchimento encolheria em direção ao meio pelas duas extremidades. O preenchimento fica sob um objeto pivot vazio na extremidade esquerda da barra, e o script escala o pivot: tudo sob ele encolhe em direção a essa extremidade, e a barra se esvazia da direita para a esquerda.
A fração precisa ser calculada com números de ponto flutuante. health / data.maxHealth divide dois ints, e C# descarta a parte fracionária de uma divisão de ints: 6 / 9 é 0, então a barra pareceria vazia depois do primeiro golpe. Converter um dos lados primeiro, (float)health / data.maxHealth, resulta em 0.67. Um tanque de água cujo nível sobe a partir do pivot na parte inferior:
float level = (float)water / capacity;
waterPivot.localScale = new Vector3(1f, level, 1f);Uma barra cheia não informa nada ao jogador, então ela começa oculta: o prefab a mantém inativa, e o primeiro golpe a ativa. Um objeto inativo não recebe Update, mas seus métodos ainda podem ser chamados. Cada inimigo é sua própria cópia do prefab, com sua própria barra.
Desafio
DifícilMostre uma barra de vida sobre cada inimigo assim que ele for atingido.
- Em
HealthBar, adicione[SerializeField] private Transform fill;epublic void Show(float fraction): ative a barra e definafill.localScale = new Vector3(fraction, 1f, 1f);. - Em
Enemy, adicione[SerializeField] private HealthBar healthBar;; depois queTakeDamagereduzir a vida, chamehealthBar.Show((float)health / data.maxHealth);.
Pressione “Jogar”: as barras aparecem e diminuem conforme as torres acertam os inimigos. Depois, pressione “Verificar”.
Experimente você mesmo
using UnityEngine;
// Vem depois: a barra acima de um inimigo que mostra quanta vida ele ainda tem.
public class HealthBar : MonoBehaviour
{
}
Todas as lições de Jogo de Unity: Defesa de Torres
Pratique por conta própria: Playground de Unity