Menu
CoddyTech

Tempo non scalato

Fa parte della sezione Creare veri giochi del percorso Unity di Coddy. Lezione 35 di 56.

Un gioco in pausa o rallentato ha comunque bisogno di un orologio reale per alcune cose: un menu di pausa animato, un conto alla rovescia prima che il gioco riprenda, un congelamento 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, in pausa o no
}

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 all'apertura del 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 gameplay, che dovrebbe fermarsi quando il gioco si ferma, e quelli non scalati per ciò che deve 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

Un hit stop fa sembrare pesante un colpo pesante: l'intero gioco si blocca per un momento all'impatto. Le frecce muovono il dispositivo di rilascio e la barra spaziatrice fa cadere un'incudine da esso (Dropper.cs, già pronto). Scrivi Anvil.cs, che ogni incudine porta con sé:

  • Quando l'incudine colpisce qualcosa, blocca il gioco: Time.timeScale 0.
  • Dopo freezeTime secondi reali (0.3 nell'Inspector), impostalo di nuovo su 1.

Premi Play, fai cadere alcune incudini, poi premi Check.

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
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Creare veri giochi