Menu
CoddyTech

Pausar com timeScale

Parte da seção Criando Jogos de Verdade do Journey de Unity da Coddy. Lição 34 de 60.

Time.timeScale determina a velocidade com que o tempo do jogo passa: 1 é a velocidade normal e 0 o interrompe. Em 0, Time.deltaTime é 0, então todo movimento escrito como speed * Time.deltaTime fica parado. FixedUpdate() deixa de ser chamado, então os Rigidbodies ficam suspensos no ar, e WaitForSeconds e Invoke ficam aguardando, já que contam o tempo do jogo. Este script alterna a pausa por meio de um botão cuja lista On Click chama TogglePause e exibe um painel enquanto o jogo está pausado:

public class PauseToggle : MonoBehaviour
{
    public GameObject pausePanel;
    bool paused;

    public void TogglePause()
    {
        paused = !paused;
        Time.timeScale = paused ? 0f : 1f;
        pausePanel.SetActive(paused);
    }
}

Nem tudo para. Update() e LateUpdate() continuam sendo chamados a cada quadro, com Time.deltaTime em 0; yield return null de uma corrotina ainda continua no quadro seguinte, e a interface ainda recebe cliques, o que permite que o botão encerre a pausa. As teclas também continuam sendo lidas: um sapo que pula ao pressionar Espaço em Update() registraria o pressionamento durante a pausa e saltaria no primeiro passo da física depois dela. O script dele ignora as teclas enquanto o tempo está parado:

void Update()
{
    if (Time.timeScale == 0f) return;   // pausado: ignore as teclas
    if (Input.GetKeyDown(KeyCode.Space))
    {
        rb.AddForce(Vector3.up * jump, ForceMode.Impulse);
    }
}

Time.timeScale se aplica ao jogo inteiro, não a uma cena: carregue outra cena enquanto seu valor é 0 e a nova cena começará pausada. Um botão do menu que reinicia ou encerra uma fase define seu valor novamente como 1 primeiro.

challenge icon

Desafio

Médio

Adicione um menu de pausa à quadra de tênis. A cena conecta os botões de pausa e retomada.

  1. Em PauseMenu.cs, Pause() define Time.timeScale = 0f; e chama panel.SetActive(true);.
  2. Resume() define Time.timeScale = 1f; e chama panel.SetActive(false);.
  3. Em BallMachine.cs, adicione if (Time.timeScale == 0f) return; acima da verificação da tecla Espaço em Update().

Pressione “Jogar”, saque uma bola e pause: ela fica suspensa no ar. Depois, pressione “Verificar”.

Experimente você mesmo

using UnityEngine;

public class PauseMenu : MonoBehaviour
{
    public GameObject panel;

    public void Pause()
    {
        // Pare o tempo do jogo e mostre o painel
    }

    public void Resume()
    {
        // Tempo do jogo na velocidade normal novamente, painel oculto
    }
}

Todas as lições de Criando Jogos de Verdade

Pratique por conta própria: Playground de Unity