Menu
CoddyTech

Ralenti

Fait partie de la section Créer de vrais jeux du Journey Unity de Coddy. Leçon 35 sur 60.

Une valeur de Time.timeScale comprise entre 0 et 1 correspond au ralenti. À 0.25, Time.deltaTime représente un quart de la durée réelle d’une image : une voiture déplacée avec speed * Time.deltaTime parcourt un quart de la distance chaque seconde réelle, les corps rigides volent et tombent à un quart de leur vitesse, et WaitForSeconds(1f) dure 4 secondes réelles. Au-dessus de 1, le jeu tourne plus vite : 2 correspond à une vitesse doublée.

La physique nécessite une ligne supplémentaire. Chaque pas de physique fait toujours avancer le jeu de Time.fixedDeltaTime, soit 0,02 seconde de temps de jeu, et à 0.25, ces pas prennent 0,08 seconde réelle : FixedUpdate() ne s’exécute que 12.5 fois par seconde réelle, les corps ne bougent donc qu’une image sur cinq et saccadent. Réduis le pas selon le même facteur, puis rétablis les deux valeurs ensuite, car Unity ne réinitialise jamais fixedDeltaTime de lui-même. Ce script ralentit le jeu tant que tu maintiens la barre d’espace :

float normalStep;

void Awake()
{
    normalStep = Time.fixedDeltaTime;   // 0.02 dans un nouveau projet
}

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;
    }
}

Avec un pas plus petit, la physique effectue toujours 50 pas par seconde réelle et chaque pas couvre un quart du temps de jeu : le ralenti reste donc fluide. Le pas est exprimé en secondes de jeu, donc le code de FixedUpdate() qui utilise Time.deltaTime continue de fonctionner sans modification.

challenge icon

Défi

Moyen

« Jouer » le vol de la comète à travers la SlowZone au ralenti.

  1. Dans SlowZone.cs, écris void OnTriggerEnter(Collider other) : définis Time.timeScale sur slowScale et Time.fixedDeltaTime sur 0.02f * slowScale.
  2. Écris void OnTriggerExit(Collider other) : rétablis-les à 1f et 0.02f.

Appuie sur « Jouer » puis sur Espace : la comète glisse dans la zone à une vitesse de 0.4. Puis clique sur « Vérifier ».

Essayez vous-même

using UnityEngine;

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

    // Ralenti tant que quelque chose se trouve dans la zone
}

Toutes les leçons de Créer de vrais jeux

Entraînez-vous par vous-même : Playground Unity