Menu
CoddyTech

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.

challenge icon

Aufgabe

Mittel

Die 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.cs darf mit der Leertaste kein Ball aufgeschlagen werden, während das Spiel pausiert ist. Das Drehen muss nicht geändert werden: Es verwendet Time.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
    }
}
quiz iconTeste dich selbst

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