Menu
CoddyTech

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.

challenge icon

Aufgabe

Mittel

Gib dem Tennisplatz ein Pausenmenü. Die Szene verbindet die Schaltflächen „Pause“ und „Resume“.

  1. In PauseMenu.cs setzt Pause() den Wert Time.timeScale = 0f; und ruft panel.SetActive(true); auf.
  2. Resume() setzt Time.timeScale = 1f; und ruft panel.SetActive(false); auf.
  3. Füge in BallMachine.cs oberhalb der Space-Prüfung in Update() 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

Übe selbstständig: Unity-Playground