Menu
CoddyTech

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.

challenge icon

Défi

Moyen

Ajoute un menu de pause au court de tennis. La scène relie les boutons Pause et Reprendre.

  1. Dans PauseMenu.cs, Pause() définit Time.timeScale = 0f; et appelle panel.SetActive(true);.
  2. Resume() définit Time.timeScale = 1f; et appelle panel.SetActive(false);.
  3. Dans BallMachine.cs, ajoute if (Time.timeScale == 0f) return; au-dessus de la vérification de la touche Space dans Update().

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

Entraînez-vous par vous-même : Playground Unity