Menu
CoddyTech

Tempo non scalato

Fa parte della sezione Creare veri giochi del percorso Unity di Coddy. Lezione 36 di 60.

Anche un gioco in pausa o rallentato ha bisogno di un orologio reale per alcune cose: un menu di pausa con animazioni, un conto alla rovescia prima che il gioco riprenda, un blocco che deve terminare da solo. Time.unscaledDeltaTime è il tempo reale trascorso dall'ultimo fotogramma, qualunque sia il valore di Time.timeScale, e Time.unscaledTime è il tempo reale trascorso dall'avvio del gioco. Questo menu di pausa fa ruotare la rotellina di caricamento usando il tempo reale, così la rotellina gira mentre il gioco è in pausa:

void Update()
{
    wheel.Rotate(0f, 0f, -180f * Time.unscaledDeltaTime);   // mezzo giro al secondo, anche in pausa
}

Le coroutine hanno la stessa coppia. WaitForSeconds conta il tempo di gioco, quindi con Time.timeScale = 0 non termina mai; WaitForSecondsRealtime conta i secondi reali. Avviata quando si apre il menu, questa coroutine fa lampeggiare il titolo del menu ogni mezzo secondo:

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

Usa i valori scalati per il gioco, che dovrebbe fermarsi quando si ferma il gioco, e quelli non scalati per ciò che deve continuare a funzionare mentre è in pausa o rallentato: i menu, le relative animazioni e i timer che terminano una pausa. Invoke non ha una versione basata sul tempo reale: conta sempre il tempo di gioco.

challenge icon

Sfida

Medio

Fai fermare il gioco all'impatto dell'incudine: quando atterra, l'intero gioco si blocca per un momento.

  1. In Anvil.cs, scrivi IEnumerator HitStop(): Time.timeScale = 0f;, poi yield return new WaitForSecondsRealtime(freezeTime);, quindi reimpostalo a 1f.
  2. Scrivi void OnCollisionEnter(Collision collision) che chiama StartCoroutine(HitStop());.

Premi «Gioca» e fai cadere le incudini con Spazio: ogni atterraggio blocca il gioco per 0.3 secondi. Poi premi «Verifica».

Provalo tu

using System.Collections;
using UnityEngine;

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

    // Blocca il gioco per freezeTime secondi reali quando l'incudine colpisce qualcosa
}

Tutte le lezioni di Creare veri giochi

Esercitati da solo: Playground Unity