Zeitlupe
Teil des Abschnitts Echte Spiele entwickeln der Unity-Journey von Coddy. Lektion 34 von 56.
Ein Time.timeScale zwischen 0 und 1 bedeutet Zeitlupe. Bei 0.25 beträgt Time.deltaTime ein Viertel der realen Framezeit. Ein Auto, das mit speed * Time.deltaTime bewegt wird, legt also 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 ist noch eine Zeile nötig. Jeder Physikschritt bewegt das Spiel weiterhin um Time.fixedDeltaTime weiter, also um 0.02 Sekunden Spielzeit. Bei 0.25 dauern diese Schritte 0.08 reale Sekunden: FixedUpdate() wird nur 12.5-mal pro realer Sekunde ausgeführt, sodass sich Körper nur in jedem fünften Frame bewegen und ruckeln. Verkleinere den Schritt um denselben Faktor und setze anschließend beide Werte zurück, da Unity fixedDeltaTime nicht von selbst zurücksetzt. Dieses Skript verlangsamt das Spiel, solange die Leertaste gedrückt wird:
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 wird die Physik weiterhin 50-mal pro realer Sekunde aktualisiert, und jeder Schritt deckt ein Viertel der Spielzeit ab. Dadurch bleibt die Zeitlupe flüssig. Der Schritt wird in Spielsekunden angegeben, daher funktioniert Code in FixedUpdate(), der Time.deltaTime verwendet, unverändert weiter.
Aufgabe
MittelEin Komet zieht über den Himmel, und die Leertaste startet ihn von links (Launcher.cs, bereit). Auf seinem Weg fliegt er durch die SlowZone, eine Trigger-Box, und dieser Teil seines Flugs soll in Zeitlupe ablaufen. Schreibe SlowZone.cs:
- Wenn etwas in die Zone eintritt, läuft die Spielzeit mit
slowScale(0.4 im Inspector), und der Physikschritt wird um denselben Faktor gegenüber 0.02 verkürzt, damit sich der Komet weiterhin gleichmäßig bewegt. - Wenn es die Zone verlässt, läuft die Zeit wieder mit normaler Geschwindigkeit, und der Physikschritt beträgt wieder 0.02.
Drücke Spielen, drücke die Leertaste und beobachte, wie der Komet hindurchfliegt. Klicke dann auf Prüfen.
Probier es selbst
using UnityEngine;
public class SlowZone : MonoBehaviour
{
public float slowScale = 0.4f;
// Zeitlupe, solange sich etwas in der Zone befindet
}
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