Menu
CoddyTech

Unskalierte Zeit

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

Ein pausiertes oder verlangsamtes Spiel benötigt für manche Dinge trotzdem eine echte Uhr: ein Pausenmenü, das animiert wird, einen Countdown, bevor das Spiel weitergeht, oder einen Freeze, der 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 Laderädchen anhand der echten Zeit, sodass es sich auch während einer Spielpause dreht:

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

Coroutinen haben dasselbe Wertepaar. WaitForSeconds zählt Spielzeit, sodass es bei Time.timeScale = 0 nie endet; WaitForSecondsRealtime zählt echte Sekunden. Diese Coroutine wird gestartet, wenn sich das Menü öffnet, und lässt den Menütitel jede 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 stoppt, 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. Für Invoke gibt es keine Version mit Echtzeit: Es zählt immer Spielzeit.

challenge icon

Aufgabe

Mittel

Gib dem Amboss einen Trefferstopp: Das ganze Spiel friert für einen Moment ein, wenn er landet.

  1. Schreibe in Anvil.cs IEnumerator HitStop(): Time.timeScale = 0f;, dann yield return new WaitForSecondsRealtime(freezeTime); und setze es anschließend wieder auf 1f.
  2. Schreibe void OnCollisionEnter(Collision collision), das StartCoroutine(HitStop()); aufruft.

Drücke „Spielen“ und lass mit der Leertaste Ambosse fallen: Bei jeder Landung friert das Spiel für 0.3 Sekunden ein. Drücke dann „Prüfen“.

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
}

Alle Lektionen in Echte Spiele entwickeln

Übe selbstständig: Unity-Playground