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.
Défi
MoyenAjoute un bref arrêt à l’enclume : tout le jeu se fige un instant lorsqu’elle atterrit.
- Dans
Anvil.cs, écrisIEnumerator HitStop():Time.timeScale = 0f;, puisyield return new WaitForSecondsRealtime(freezeTime);, puis rétablis la valeur à1f. - Écris
void OnCollisionEnter(Collision collision)qui appelleStartCoroutine(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
1Texte à l’écran
Canvas et texteAfficher le scoreFormater les nombresUn compte à reboursRécapitulatif : compteur de vitesse4Scènes et niveaux
Charger une scèneRedémarrer le niveauNiveau suivantConserver entre les scènesRécapitulatif : sélection du niveau7Contrôle du temps
Mettre en pause avec timeScaleRalentiTemps non mis à l’échelleRécapitulatif : Bullet Time2Boutons et écrans
Boutons et onClickLambdasRelier les éléments dans l’InspectorActiver et désactiver les panneauxBarres de santéRécapitulatif : boutique d’améliorations5Sauvegarder avec PlayerPrefs
Enregistrer un nombreCharger avec une valeur par défautMeilleur scoreEnregistrer les paramètresRécapitulatif : les pièces à la banqueEntraînez-vous par vous-même : Playground Unity