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.
Desafio
MédioAdicione um menu de pausa à quadra de tênis. A cena conecta os botões de pausa e retomada.
- Em
PauseMenu.cs,Pause()defineTime.timeScale = 0f;e chamapanel.SetActive(true);. Resume()defineTime.timeScale = 1f;e chamapanel.SetActive(false);.- Em
BallMachine.cs, adicioneif (Time.timeScale == 0f) return;acima da verificação da tecla Espaço emUpdate().
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
1Texto na tela
Canvas e textoExiba a pontuaçãoFormate númerosUm cronômetro regressivoRevisão: velocímetro2Botõ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 bancoPratique por conta própria: Playground de Unity