Menu
CoddyTech

Temps non mis à l’échelle

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

Un jeu en pause ou ralenti a tout de même besoin d’une horloge réelle pour certaines choses : un menu de pause qui s’anime, un compte à rebours avant la reprise du jeu, un gel qui doit prendre fin de lui-même. Time.unscaledDeltaTime correspond au temps réel écoulé depuis la dernière image, quelle que soit la valeur de Time.timeScale, et Time.unscaledTime correspond au temps réel écoulé depuis le démarrage du jeu. Ce menu de pause fait tourner sa roue de chargement en temps réel, de sorte qu’elle tourne même quand le jeu est en pause :

void Update()
{
    wheel.Rotate(0f, 0f, -180f * Time.unscaledDeltaTime);   // un demi-tour par seconde, même en pause
}

Les coroutines ont la même paire. WaitForSeconds compte le temps de jeu : à Time.timeScale = 0, il ne se termine donc jamais ; WaitForSecondsRealtime compte les secondes réelles. Lancée à l’ouverture du menu, cette coroutine fait clignoter le titre du menu toutes les demi-secondes :

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

Utilise les valeurs mises à l’échelle pour le gameplay, qui doit s’arrêter quand le jeu s’arrête, et les valeurs non mises à l’échelle pour ce qui doit continuer à fonctionner pendant la pause ou au ralenti : les menus, leurs animations et les minuteurs qui mettent fin à une pause. Invoke n’a pas de version en temps réel : il compte toujours le temps de jeu.

challenge icon

Défi

Moyen

Ajoute un bref arrêt à l’enclume : tout le jeu se fige un instant lorsqu’elle atterrit.

  1. Dans Anvil.cs, écris IEnumerator HitStop() : Time.timeScale = 0f;, puis yield return new WaitForSecondsRealtime(freezeTime);, puis rétablis la valeur à 1f.
  2. Écris void OnCollisionEnter(Collision collision) qui appelle StartCoroutine(HitStop());.

Appuie sur « Jouer » et fais tomber des enclumes avec la barre d’espace : chaque atterrissage fige le jeu pendant 0.3 seconde. Puis clique sur « Vérifier ».

Essayez vous-même

using System.Collections;
using UnityEngine;

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

    // Fige le jeu pendant freezeTime secondes réelles lorsque l’enclume heurte quelque chose
}

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

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