Pausieren mit timeScale
Teil des Abschnitts Echte Spiele entwickeln der Unity-Journey von Coddy. Lektion 33 von 56.
Time.timeScale gibt an, wie schnell die Spielzeit vergeht: 1 entspricht der normalen Geschwindigkeit und 0 hält sie an. Bei 0 ist Time.deltaTime gleich 0, daher bleibt jede Bewegung, die als speed * Time.deltaTime geschrieben ist, stehen. FixedUpdate() wird nicht mehr aufgerufen, sodass Rigidbodys in der Luft hängen, 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 Panel 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. Auch Tasten werden weiterhin gelesen: Ein Frosch, der in Update() mit der Leertaste springt, würde den Tastendruck 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 gesamte 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 ein Level neu startet oder beendet, setzt den Wert zuerst wieder auf 1.
Aufgabe
MittelDie Ballmaschine auf dem Tennisplatz dreht sich mit den Pfeiltasten links und rechts und schlägt mit der Leertaste einen Ball auf (BallMachine.cs). Füge dem Platz ein Pausenmenü in PauseMenu.cs hinzu. In der Szene ist die Schaltfläche Pause mit Pause() und die Schaltfläche Resume, die sich auf dem ausgeblendeten PausePanel befindet, mit Resume() verknüpft; im Inspector wird das Panel dem Feld panel zugewiesen.
Pause()hält die Spielzeit an und zeigt das Panel an.Resume()setzt die Spielzeit auf normale Geschwindigkeit zurück und blendet das Panel aus.- In
BallMachine.csdarf mit der Leertaste kein Ball aufgeschlagen werden, während das Spiel pausiert ist. Das Drehen muss nicht geändert werden: Es verwendetTime.deltaTime.
Drücke Play, schlage einen Ball auf und pausiere das Spiel, während er in der Luft ist. Klicke dann auf Check.
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
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Echte Spiele entwickeln
1Text auf dem Bildschirm
Canvas und TextPunktestand anzeigenZahlen formatierenEin Countdown-TimerRückblick: Tachometer4Szenen und Level
Eine Szene ladenDas Level neu startenNächstes LevelZwischen Szenen beibehaltenRückblick: Levelauswahl10Projekt: 3D-Plattformer
Der ParcoursBewegliche Plattformen2Buttons 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