Mettre en pause avec timeScale
Fait partie de la section Créer de vrais jeux du Journey Unity de Coddy. Leçon 34 sur 60.
Time.timeScale détermine la vitesse à laquelle le temps s’écoule dans le jeu : 1 correspond à la vitesse normale et 0 l’arrête. À 0, Time.deltaTime vaut 0, donc tout mouvement écrit sous la forme speed * Time.deltaTime reste immobile. FixedUpdate() n’est plus appelé : les Rigidbodies restent alors suspendus dans les airs, et WaitForSeconds et Invoke attendent, puisqu’ils comptent le temps du jeu. Ce script active ou désactive la pause à l’aide d’un bouton dont la liste On Click appelle TogglePause, et affiche un panneau lorsque le jeu est en pause :
public class PauseToggle : MonoBehaviour
{
public GameObject pausePanel;
bool paused;
public void TogglePause()
{
paused = !paused;
Time.timeScale = paused ? 0f : 1f;
pausePanel.SetActive(paused);
}
}Tout ne s’arrête pas. Update() et LateUpdate() sont toujours appelés à chaque image, avec Time.deltaTime à 0, une coroutine dont le yield return null revient toujours à l’image suivante, et l’interface utilisateur accepte toujours les clics, ce qui permet au bouton de mettre fin à la pause. Les touches sont également toujours lues : une grenouille qui saute avec la barre d’espace dans Update() prendrait en compte la pression pendant la pause et bondirait au premier pas physique après celle-ci. Son script ignore les touches tant que le temps est arrêté :
void Update()
{
if (Time.timeScale == 0f) return; // en pause : ignorer les touches
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(Vector3.up * jump, ForceMode.Impulse);
}
}Time.timeScale s’applique à l’ensemble du jeu, et non à une scène : si tu charges une autre scène alors qu’il vaut 0, la nouvelle scène démarre en pause. Un bouton de menu qui redémarre ou quitte un niveau le remet d’abord à 1.
Défi
MoyenAjoute un menu de pause au court de tennis. La scène relie les boutons Pause et Reprendre.
- Dans
PauseMenu.cs,Pause()définitTime.timeScale = 0f;et appellepanel.SetActive(true);. Resume()définitTime.timeScale = 1f;et appellepanel.SetActive(false);.- Dans
BallMachine.cs, ajouteif (Time.timeScale == 0f) return;au-dessus de la vérification de la touche Space dansUpdate().
Appuie sur « Jouer », envoie une balle et mets le jeu en pause : elle reste suspendue dans les airs. Puis appuie sur « Vérifier ».
Essayez vous-même
using UnityEngine;
public class PauseMenu : MonoBehaviour
{
public GameObject panel;
public void Pause()
{
// Arrêter le temps de jeu et afficher le panneau
}
public void Resume()
{
// Le temps de jeu reprend sa vitesse normale, le panneau est masqué
}
}
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