Pausieren mit timeScale
Teil des Abschnitts Echte Spiele entwickeln der Unity-Journey von Coddy. Lektion 34 von 60.
Time.timeScale bestimmt, wie schnell die Spielzeit vergeht: 1 entspricht normaler Geschwindigkeit und 0 hält sie an. Bei 0 ist Time.deltaTime 0, sodass jede Bewegung, die als speed * Time.deltaTime geschrieben ist, stillsteht. FixedUpdate() wird nicht mehr aufgerufen, sodass Rigidbody-Objekte in der Luft hängen bleiben, und WaitForSeconds sowie Invoke warten, da sie die Spielzeit zählen. Dieses Skript schaltet die Pause über eine Schaltfläche um, deren On-Click-Liste TogglePause aufruft, und zeigt während der Pause ein Bedienfeld an:
public class PauseToggle : MonoBehaviour
{
public GameObject pausePanel;
bool paused;
public void TogglePause()
{
paused = !paused;
Time.timeScale = paused ? 0f : 1f;
pausePanel.SetActive(paused);
}
}Nicht alles hält an. Update() und LateUpdate() werden weiterhin in jedem Frame aufgerufen, wobei Time.deltaTime 0 beträgt. Das yield return null einer Coroutine wird weiterhin im nächsten Frame fortgesetzt, und die Benutzeroberfläche reagiert weiterhin auf Klicks. So kann die Schaltfläche die Pause beenden. Tasten werden ebenfalls weiterhin abgefragt: Ein Frosch, der in Update() bei gedrückter Leertaste springt, würde die Eingabe während der Pause erfassen und beim ersten Physikschritt danach losspringen. Sein Skript ignoriert die Tasten, solange die Zeit stillsteht:
void Update()
{
if (Time.timeScale == 0f) return; // pausiert: Tasteneingaben ignorieren
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(Vector3.up * jump, ForceMode.Impulse);
}
}Time.timeScale gilt für das ganze Spiel, nicht nur für eine Szene: Lade eine andere Szene, während der Wert 0 ist, startet auch die neue Szene pausiert. Eine Menüschaltfläche, die einen Level neu startet oder beendet, setzt den Wert zuerst wieder auf 1.
Aufgabe
MittelGib dem Tennisplatz ein Pausenmenü. Die Szene verbindet die Schaltflächen „Pause“ und „Resume“.
- In
PauseMenu.cssetztPause()den WertTime.timeScale = 0f;und ruftpanel.SetActive(true);auf. Resume()setztTime.timeScale = 1f;und ruftpanel.SetActive(false);auf.- Füge in
BallMachine.csoberhalb der Space-Prüfung inUpdate()Folgendes hinzu:if (Time.timeScale == 0f) return;.
Drücke auf „Spielen“, schlage einen Ball auf und pausiere: Er bleibt mitten in der Luft hängen. Klicke dann auf „Prüfen“.
Probier es selbst
using UnityEngine;
public class PauseMenu : MonoBehaviour
{
public GameObject panel;
public void Pause()
{
// Spielzeit anhalten und das Panel anzeigen
}
public void Resume()
{
// Spielzeit läuft wieder mit normaler Geschwindigkeit, Panel ausgeblendet
}
}
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