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.
Aufgabe
EinfachZeige Schild und Gesundheit des Ritters in zwei Balken an.
- Schreibe
ShowBars():shieldBar.fillAmount = (float)shield / maxShield;und dasselbe fürhealthBarmithpundmaxHp. Rufe die Funktion inStart()auf. - In
TakeDamagefängt das SchildMathf.Min(amount, shield)ab, und der Rest wird vonhpabgezogen, wobei der Wert nie unter 0 sinkt. Rufe dannShowBars()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
1Text auf dem Bildschirm
Canvas und TextPunktestand anzeigenZahlen formatierenEin Countdown-TimerRückblick: Tachometer2Buttons und Bildschirme
Buttons und onClickLambdasVerknüpfungen im InspectorPanels ein- und ausblendenGesundheitsbalkenRückblick: Upgrade-Shop5Speichern mit PlayerPrefs
Eine Zahl speichernMit einem Standardwert ladenHöchstpunktzahlEinstellungen speichernRückblick: Münzen auf der BankÜbe selbstständig: Unity-Playground