Tempo não escalado
Parte da seção Criando Jogos de Verdade do Journey de Unity da Coddy. Lição 36 de 60.
Um jogo pausado ou desacelerado ainda precisa de um relógio real para algumas coisas: um menu de pausa com animações, uma contagem regressiva antes de o jogo continuar, um congelamento que precisa terminar sozinho. Time.unscaledDeltaTime é o tempo real desde o último quadro, seja qual for o valor de Time.timeScale, e Time.unscaledTime é o tempo real desde que o jogo começou. Este menu de pausa gira sua roda de carregamento usando o tempo real, então a roda continua girando enquanto o jogo está pausado:
void Update()
{
wheel.Rotate(0f, 0f, -180f * Time.unscaledDeltaTime); // meia volta por segundo, esteja pausado ou não
}As corrotinas têm o mesmo par. WaitForSeconds conta o tempo do jogo, então, com Time.timeScale = 0, ele nunca termina; WaitForSecondsRealtime conta segundos reais. Iniciada quando o menu é aberto, esta corrotina pisca o título do menu a cada meio segundo:
IEnumerator Blink()
{
while (true)
{
title.SetActive(!title.activeSelf);
yield return new WaitForSecondsRealtime(0.5f);
}
}Use os valores escalados para a jogabilidade, que deve parar quando o jogo para, e os valores não escalados para o que precisa continuar funcionando enquanto o jogo está pausado ou desacelerado: menus, suas animações e temporizadores que encerram uma pausa. Invoke não tem uma versão que use tempo real: ele sempre conta o tempo do jogo.
Desafio
MédioAdicione uma pausa ao impacto da bigorna: o jogo inteiro congela por um momento quando ela cai.
- Em
Anvil.cs, escrevaIEnumerator HitStop():Time.timeScale = 0f;, depoisyield return new WaitForSecondsRealtime(freezeTime);e, em seguida, defina novamente como1f. - Escreva
void OnCollisionEnter(Collision collision)que chamaStartCoroutine(HitStop());.
Pressione “Jogar” e solte bigornas com a tecla Espaço: cada aterrissagem congela o jogo por 0.3 segundos. Depois, clique em “Verificar”.
Experimente você mesmo
using System.Collections;
using UnityEngine;
public class Anvil : MonoBehaviour
{
public float freezeTime = 0.3f;
// Congele o jogo por freezeTime segundos reais quando a bigorna atingir algo
}
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