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.
Défi
Moyen« Jouer » le vol de la comète à travers la SlowZone au ralenti.
- Dans
SlowZone.cs, écrisvoid OnTriggerEnter(Collider other): définisTime.timeScalesurslowScaleetTime.fixedDeltaTimesur0.02f * slowScale. - Écris
void OnTriggerExit(Collider other): rétablis-les à1fet0.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
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