Menu
CoddyTech

Zeitlupe

Teil des Abschnitts Echte Spiele entwickeln der Unity-Journey von Coddy. Lektion 35 von 60.

Ein Time.timeScale zwischen 0 und 1 bedeutet Zeitlupe. Bei 0.25 beträgt Time.deltaTime ein Viertel der tatsächlichen Framezeit. Ein Auto, das mit speed * Time.deltaTime bewegt wird, legt daher pro realer Sekunde ein Viertel der Strecke zurück, Rigidbodies fliegen und fallen mit einem Viertel ihrer Geschwindigkeit, und WaitForSeconds(1f) dauert 4 reale Sekunden. Über 1 läuft das Spiel schneller: 2 bedeutet doppelte Geschwindigkeit.

Für die Physik braucht es noch eine Zeile. Jeder Physikschritt bewegt das Spiel weiterhin um Time.fixedDeltaTime weiter, also um 0.02 Sekunden Spielzeit. Bei 0.25 dauern diese 0.08 reale Sekunden: FixedUpdate() läuft nur 12.5-mal pro realer Sekunde, sodass sich Körper nur jedes fünfte Frame bewegen und ruckeln. Verkleinere den Schritt um denselben Faktor und setze anschließend beide Werte zurück, da Unity fixedDeltaTime nie selbst zurücksetzt. Dieses Skript verlangsamt das Spiel, solange die Leertaste gedrückt ist:

float normalStep;

void Awake()
{
    normalStep = Time.fixedDeltaTime;   // 0.02 in einem neuen Projekt
}

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        Time.timeScale = 0.25f;
        Time.fixedDeltaTime = normalStep * Time.timeScale;
    }
    if (Input.GetKeyUp(KeyCode.Space))
    {
        Time.timeScale = 1f;
        Time.fixedDeltaTime = normalStep;
    }
}

Mit dem kleineren Schritt werden weiterhin 50 Physikschritte pro realer Sekunde ausgeführt, und jeder Schritt umfasst ein Viertel der Spielzeit, sodass die Zeitlupe flüssig bleibt. Der Schritt wird in Spielsekunden angegeben, daher funktioniert Code in FixedUpdate(), der Time.deltaTime verwendet, unverändert weiter.

challenge icon

Aufgabe

Mittel

Spiele den Flug des Kometen durch die SlowZone in Zeitlupe ab.

  1. Schreibe in SlowZone.cs void OnTriggerEnter(Collider other): Setze Time.timeScale auf slowScale und Time.fixedDeltaTime auf 0.02f * slowScale.
  2. Schreibe void OnTriggerExit(Collider other): Setze sie auf 1f und 0.02f zurück.

Drücke „Spielen“ und die Leertaste: Der Komet gleitet mit 0.4-facher Geschwindigkeit durch die Zone. Drücke dann „Prüfen“.

Probier es selbst

using UnityEngine;

public class SlowZone : MonoBehaviour
{
    public float slowScale = 0.4f;

    // Zeitlupe, solange sich etwas in der Zone befindet
}

Alle Lektionen in Echte Spiele entwickeln

Übe selbstständig: Unity-Playground