Menu
CoddyTech

Pausar com timeScale

Parte da seção Criando jogos de verdade do Journey de Unity da Coddy. Lição 33 de 56.

Time.timeScale determina a velocidade do tempo do jogo: 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 esperam, pois contam o tempo do jogo. Este script alterna a pausa por meio de um botão cuja lista On Click chama TogglePause, e mostra 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; um yield return null de uma coroutine ainda retoma 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 apertar Space 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 for 0, e a nova cena começará pausada. Um botão de menu que reinicia ou encerra um nível primeiro o define novamente como 1.

challenge icon

Desafio

Médio

A máquina de bolas na quadra de tênis gira com as setas para a esquerda e para a direita e lança uma bola ao pressionar Espaço (BallMachine.cs). Adicione um menu de pausa à quadra em PauseMenu.cs. A cena conecta o botão Pausar a Pause() e o botão Retomar, que fica no PausePanel oculto, a Resume(); no Inspector, coloque o painel em panel.

  • Pause() para o tempo do jogo e mostra o painel.
  • Resume() restaura a velocidade normal do tempo do jogo e oculta o painel.
  • Em BallMachine.cs, a tecla Espaço não deve lançar uma bola enquanto o jogo estiver pausado. Não é necessário alterar a rotação: ela é feita com Time.deltaTime.

Pressione Jogar, lance uma bola e pause o jogo enquanto ela estiver no ar; em seguida, clique em 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 novamente na velocidade normal, painel oculto
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Criando jogos de verdade