Menu
CoddyTech

Gesundheitsbalken

Teil des Abschnitts Echte Spiele entwickeln der Unity-Journey von Coddy. Lektion 10 von 60.

Eine Leiste, die sich leert, ist ein UI-Image, dessen Bildtyp auf Gefüllt gesetzt ist. Diese Einstellung wird angezeigt, sobald das Image ein Quellbild hat; bei None blendet der Inspector sie aus. Die Füllmethode Horizontal mit dem Füllursprung Links lässt die Leiste zu ihrem linken Ende hin schrumpfen, und fillAmount gibt von 0 bis 1 an, wie viel davon gezeichnet wird. Ein dunkles Image dahinter zeigt den leeren Teil. Unity begrenzt fillAmount, daher zeichnet 1.4 eine volle Leiste und -0.2 eine leere.

fillAmount gibt den verbleibenden Anteil der Gesundheit an: die Gesundheit geteilt durch ihren Maximalwert. Bei int-Feldern ist das eine Ganzzahldivision, und 350 / 500 ergibt 0. Wandle daher zuerst eine Seite in float um. Image befindet sich in UnityEngine.UI. Diese Bossleiste wird nach jedem Treffer aktualisiert:

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
}

Auch die Farbe der Leiste kann sich nach der Gesundheit richten: bossBar.color = Color.Lerp(Color.red, Color.green, bossBar.fillAmount); ist grün, wenn die Leiste voll ist, und wird rot, während sie sich leert.

challenge icon

Aufgabe

Einfach

Zeige Schild und Gesundheit des Ritters in zwei Balken an.

  1. Schreibe ShowBars(): shieldBar.fillAmount = (float)shield / maxShield; und dasselbe für healthBar mit hp und maxHp. Rufe die Funktion in Start() auf.
  2. In TakeDamage fängt das Schild Mathf.Min(amount, shield) ab, und der Rest wird von hp abgezogen, wobei der Wert nie unter 0 sinkt. Rufe dann ShowBars() auf.

Drücke „Spielen“ und gehe auf die Stacheln: Der Schildbalken leert sich zuerst. Drücke dann „Prüfen“.

Probier es selbst

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;
        // Beide Balken füllen
    }

    public void TakeDamage(int amount)
    {
        // Der Schild absorbiert so viel Schaden wie möglich; der Rest wird von hp abgezogen, höchstens bis auf 0. Anschließend beide Balken anzeigen.
    }
}

Alle Lektionen in Echte Spiele entwickeln

Übe selbstständig: Unity-Playground