Menu
CoddyTech

Unskalierte Zeit

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

Ein pausiertes oder verlangsamtes Spiel braucht für manche Dinge trotzdem eine echte Uhr: ein Pausenmenü, das animiert wird, einen Countdown, bevor das Spiel weitergeht, oder ein Einfrieren, das von selbst enden muss. Time.unscaledDeltaTime ist die echte Zeit seit dem letzten Frame, unabhängig davon, welchen Wert Time.timeScale hat, und Time.unscaledTime ist die echte Zeit seit dem Start des Spiels. Dieses Pausenmenü dreht sein Laderad anhand der echten Zeit, sodass sich das Rad auch während der Spielpause dreht:

void Update()
{
    wheel.Rotate(0f, 0f, -180f * Time.unscaledDeltaTime);   // eine halbe Umdrehung pro Sekunde, auch wenn pausiert
}

Coroutinen haben dasselbe Paar. WaitForSeconds zählt Spielzeit, endet also bei Time.timeScale = 0 nie; WaitForSecondsRealtime zählt echte Sekunden. Diese Coroutine wird gestartet, wenn das Menü geöffnet wird, und lässt den Titel des Menüs alle halbe Sekunde blinken:

IEnumerator Blink()
{
    while (true)
    {
        title.SetActive(!title.activeSelf);
        yield return new WaitForSecondsRealtime(0.5f);
    }
}

Verwende die skalierten Werte für das Gameplay, das anhalten sollte, wenn das Spiel anhält, und die nicht skalierten Werte für alles, was während einer Pause oder Verlangsamung weiterlaufen muss: Menüs, ihre Animationen und Timer, die eine Pause beenden. Invoke hat keine Version für echte Zeit: Es zählt immer Spielzeit.

challenge icon

Aufgabe

Mittel

Ein Hit Stop lässt einen schweren Schlag schwer wirken: Das ganze Spiel friert beim Aufprall kurz ein. Mit den Pfeiltasten bewegst du den Werfer, und mit der Leertaste lässt du einen Amboss daraus fallen (Dropper.cs, fertig). Schreibe Anvil.cs, die jeder Amboss mit sich führt:

  • Wenn der Amboss etwas trifft, friere das Spiel ein: Time.timeScale 0.
  • Setze es freezeTime Echtzeitsekunden später (0.3 im Inspector) wieder auf 1.

Drücke Play, lasse ein paar Ambosse fallen und klicke dann auf Check.

Probier es selbst

using System.Collections;
using UnityEngine;

public class Anvil : MonoBehaviour
{
    public float freezeTime = 0.3f;

    // Halte das Spiel für freezeTime Sekunden Echtzeit an, wenn der Amboss auf etwas trifft
}
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