Menu
CoddyTech

Barras de vida

Parte da seção Criando Jogos de Verdade do Journey de Unity da Coddy. Lição 10 de 60.

Uma barra que se esvazia é uma Image de UI com o Image Type definido como Filled. Essa configuração aparece quando a Image tem uma Source Image; com None, o Inspector a oculta. Fill Method Horizontal com Fill Origin Left reduz a barra em direção à sua extremidade esquerda, e fillAmount, de 0 a 1, determina quanto dela é desenhado. Uma Image escura atrás dela mostra a parte vazia. Unity limita fillAmount, então 1.4 desenha uma barra cheia e -0.2, uma vazia.

fillAmount representa a parte da vida que resta: a vida dividida pelo máximo. Com campos int, isso é uma divisão inteira, e 350 / 500 é 0, então converta um dos lados para float primeiro. Image fica em UnityEngine.UI. Esta barra do chefe é atualizada após cada golpe:

public Image bossBar;
public int bossMaxHp = 500;
private int bossHp = 500;

public void Hit(int damage)
{
    bossHp = Mathf.Max(bossHp - damage, 0);
    bossBar.fillAmount = (float)bossHp / bossMaxHp;   // 350 / 500 = 0.7
}

A cor da barra também pode acompanhar a vida: bossBar.color = Color.Lerp(Color.red, Color.green, bossBar.fillAmount); fica verde quando a barra está cheia e vai ficando vermelha à medida que se esvazia.

challenge icon

Desafio

Fácil

Exiba o escudo e a vida do cavaleiro em duas barras.

  1. Escreva ShowBars(): shieldBar.fillAmount = (float)shield / maxShield; e faça o mesmo para healthBar com hp e maxHp. Chame-o em Start().
  2. Em TakeDamage, o escudo absorve Mathf.Min(amount, shield), e o restante é descontado de hp, que nunca fica abaixo de 0. Depois, chame ShowBars().

Pressione “Jogar” e caminhe sobre os espinhos: a barra do escudo se esvazia primeiro. Depois, pressione “Verificar”.

Experimente você mesmo

using UnityEngine;
using UnityEngine.UI;

public class Knight : MonoBehaviour
{
    public Image healthBar;
    public Image shieldBar;
    public int maxHp = 80;
    public int maxShield = 40;
    private int hp;
    private int shield;

    void Start()
    {
        hp = maxHp;
        shield = maxShield;
        // Preencha as duas barras
    }

    public void TakeDamage(int amount)
    {
        // O escudo absorve o dano que puder; o restante é descontado de hp, até 0. Depois, atualize as duas barras.
    }
}

Todas as lições de Criando Jogos de Verdade

Pratique por conta própria: Playground de Unity