Ein Countdown-Timer
Teil des Abschnitts Echte Spiele entwickeln der Unity-Journey von Coddy. Lektion 4 von 60.
Ein Countdown speichert die verbleibende Zeit in einem float und zieht in jedem Frame Time.deltaTime davon ab. Der letzte Frame endet selten genau bei 0, daher stoppt Mathf.Max den Wert dort, und das Ende muss genau einmal eintreten. Diese Zündschnur gibt dem Spieler 5 Sekunden, um eine Bombe zu entschärfen:
public TMP_Text fuseText;
public float fuse = 5f;
private bool exploded;
void Update()
{
if (exploded)
{
return;
}
fuse = Mathf.Max(fuse - Time.deltaTime, 0f);
fuseText.text = "Fuse: " + Mathf.CeilToInt(fuse);
if (fuse == 0f)
{
exploded = true;
fuseText.text = "BOOM";
fuseText.color = Color.red;
}
}Mathf.CeilToInt rundet auf, was genau das ist, was ein Countdown anzeigt: 5 während der gesamten ersten Sekunde (4.99 wird auf 5 aufgerundet), 1 während der letzten Sekunde und 0 erst, wenn die Zeit abgelaufen ist. (int)fuse würde 4.99 auf 4 abrunden und während der gesamten letzten Sekunde 0 anzeigen, obwohl die Bombe noch tickt; Mathf.RoundToInt würde während der letzten halben Sekunde 0 anzeigen. Für einen längeren Countdown, der in Minuten und Sekunden angezeigt wird, gilt dieselbe Regel: Runde zuerst die Zeit auf ganze Sekunden auf und formatiere diese dann.
Das vorzeitige return lässt BOOM auf dem Bildschirm stehen: Ohne es würde im nächsten Frame Fuse: 0 darübergeschrieben. Auch ein Textfeld hat eine Farbe, und fuseText.color = Color.red färbt es rot.
Aufgabe
EinfachLass die Parkuhr die bezahlte Zeit herunterzählen.
- Ziehe in
Update()Time.deltaTimevontimeLeftab, ohne unter 0 zu gehen, und zeigeMathf.CeilToInt(timeLeft)als Minuten und Sekunden an:1:15. - Mit der Leertaste werden 30 Sekunden hinzugefügt, bis höchstens
maxTime(2:00). - Bei 0 zeige
EXPIREDinColor.redan. BeginneUpdate()mitif (timeLeft == 0f) return;, damit es so bleibt.
Drücke „Spielen“ und wirf Münzen ein: Die Zeit bleibt bei 2:00 stehen. Drücke dann „Prüfen“.
Probier es selbst
using UnityEngine;
using TMPro;
public class ParkingMeter : MonoBehaviour
{
public TMP_Text meterText;
public float timeLeft = 60f;
public float maxTime = 120f;
void Update()
{
// Zähle timeLeft herunter und zeige die verbleibende Zeit in Minuten und Sekunden an; Space fügt 30 Sekunden hinzu
}
}
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