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.
Desafio
MédioA 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 comTime.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
}
}
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
1Texto na tela
Canvas e textoExiba a pontuaçãoFormate númerosUm cronômetro regressivoRevisão: velocímetro4Cenas e Fases
Carregar uma CenaReiniciar a FasePróxima FaseManter entre CenasRevisão: Seleção de Fases10Projeto: Jogo de Plataforma 3D
O PercursoPlataformas Móveis2Botões e telas
Botões e onClickLambdasConectando no InspectorPainéis ligados e desligadosBarras de vidaRevisão: Loja de melhorias5Salvando com PlayerPrefs
Salvar um númeroCarregar com um valor padrãoRecordeSalvar configuraçõesRevisão: Moedas no banco