Menu
CoddyTech

Rallentatore

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

Un valore di Time.timeScale compreso tra 0 e 1 produce un effetto al rallentatore. A 0.25, Time.deltaTime è un quarto del tempo reale di un fotogramma, quindi un'auto spostata da speed * Time.deltaTime percorre un quarto della sua distanza ogni secondo reale, i Rigidbody volano e cadono a un quarto della loro velocità e WaitForSeconds(1f) dura 4 secondi reali. Oltre 1, il gioco procede velocemente: 2 significa velocità doppia.

Per la fisica serve un'altra riga. Ogni passaggio della fisica fa comunque avanzare il gioco di Time.fixedDeltaTime, ovvero 0.02 secondi di tempo di gioco; con 0.25, questi richiedono 0.08 secondi reali: FixedUpdate() viene eseguito solo 12.5 volte al secondo reale, quindi i corpi si muovono un fotogramma ogni cinque e procedono a scatti. Riduci il passo dello stesso fattore e ripristina entrambi i valori in seguito, perché Unity non reimposta mai fixedDeltaTime autonomamente. Questo script rallenta il gioco mentre tieni premuto Space:

float normalStep;

void Awake()
{
    normalStep = Time.fixedDeltaTime;   // 0.02 in un nuovo progetto
}

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        Time.timeScale = 0.25f;
        Time.fixedDeltaTime = normalStep * Time.timeScale;
    }
    if (Input.GetKeyUp(KeyCode.Space))
    {
        Time.timeScale = 1f;
        Time.fixedDeltaTime = normalStep;
    }
}

Con il passo ridotto, la fisica continua a eseguire 50 passaggi al secondo reale e ciascun passaggio copre un quarto del tempo di gioco, quindi il rallentatore rimane fluido. Il passo è espresso in secondi di gioco, quindi il codice in FixedUpdate() che usa Time.deltaTime continua a funzionare senza modifiche.

challenge icon

Sfida

Medio

Fai volare la cometa attraverso la SlowZone al rallentatore.

  1. In SlowZone.cs, scrivi void OnTriggerEnter(Collider other): imposta Time.timeScale su slowScale e Time.fixedDeltaTime su 0.02f * slowScale.
  2. Scrivi void OnTriggerExit(Collider other): ripristinali a 1f e 0.02f.

Premi «Gioca» e Spazio: la cometa attraversa la zona a una velocità di 0.4. Poi premi «Verifica».

Provalo tu

using UnityEngine;

public class SlowZone : MonoBehaviour
{
    public float slowScale = 0.4f;

    // Rallentamento finché qualcosa si trova all'interno della zona
}

Tutte le lezioni di Creare veri giochi

Esercitati da solo: Playground Unity