Mettre en pause avec timeScale
Fait partie de la section Créer de vrais jeux du Journey Unity de Coddy. Leçon 33 sur 56.
Time.timeScale détermine la vitesse à laquelle le temps du jeu s'écoule : 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ée, les corps rigides restent 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 pendant la 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ées à chaque image, avec Time.deltaTime à 0, un yield return null dans une coroutine reprend toujours à l'image suivante, et l'interface continue de réagir aux clics, ce qui permet au bouton de mettre fin à la pause. Les touches sont toujours lues aussi : une grenouille qui saute avec Espace dans Update() prendrait en compte l'appui pendant la pause et bondirait au premier pas de simulation physique après celle-ci. Son script ignore les touches lorsque le temps est à l'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 à tout le jeu, pas à 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
MoyenLa machine à balles du court de tennis tourne avec les flèches gauche et droite et lance une balle avec la barre d’espace (BallMachine.cs). Ajoute un menu de pause au court dans PauseMenu.cs. Dans la scène, le bouton Pause est relié à Pause() et le bouton Resume, placé sur le PausePanel masqué, à Resume() ; dans l’Inspector, affecte le panneau à panel.
Pause()arrête le temps de jeu et affiche le panneau.Resume()rétablit la vitesse normale du temps de jeu et masque le panneau.- Dans
BallMachine.cs, la barre d’espace ne doit pas lancer de balle lorsque le jeu est en pause. La rotation ne nécessite aucune modification : elle utiliseTime.deltaTime.
Appuie sur Play, lance une balle et mets le jeu en pause pendant qu’elle est en l’air, puis clique sur Check.
Essayez vous-même
using UnityEngine;
public class PauseMenu : MonoBehaviour
{
public GameObject panel;
public void Pause()
{
// Arrêter le temps du jeu et afficher le panneau
}
public void Resume()
{
// Le temps du jeu reprend à vitesse normale, le panneau est masqué
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
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 Time10Projet : jeu de plateforme en 3D
Le parcoursPlateformes mobiles2Boutons 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 banque