Menu
CoddyTech

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.

challenge icon

Défi

Moyen

La 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 utilise Time.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é
    }
}
quiz iconTestez-vous

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