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.
Aufgabe
MittelGib dem Amboss einen Trefferstopp: Das ganze Spiel friert für einen Moment ein, wenn er landet.
- Schreibe in
Anvil.csIEnumerator HitStop():Time.timeScale = 0f;, dannyield return new WaitForSecondsRealtime(freezeTime);und setze es anschließend wieder auf1f. - Schreibe
void OnCollisionEnter(Collision collision), dasStartCoroutine(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
1Text auf dem Bildschirm
Canvas und TextPunktestand anzeigenZahlen formatierenEin Countdown-TimerRückblick: Tachometer2Buttons 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Übe selbstständig: Unity-Playground