Menu
CoddyTech

Tempo não escalado

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

Um jogo pausado ou em câmera lenta ainda precisa de um relógio real para algumas coisas: um menu de pausa com animação, 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 ela 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 de jogo, então, com Time.timeScale = 0, 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 parar, e os não escalados para o que precisa continuar funcionando enquanto o jogo está pausado ou em câmera lenta: menus, suas animações e temporizadores que encerram uma pausa. Invoke não tem uma versão de tempo real: sempre conta o tempo de jogo.

challenge icon

Desafio

Médio

Um hit stop faz um golpe pesado parecer pesado: o jogo inteiro congela por um momento no impacto. As setas movem o lançador e a barra de espaço solta uma bigorna dele (Dropper.cs, pronto). Escreva Anvil.cs, que cada bigorna carrega:

  • Quando a bigorna atinge qualquer coisa, congele o jogo: Time.timeScale 0.
  • Após freezeTime segundos reais (0.3 no Inspector), defina-o novamente como 1.

Pressione Play, solte algumas bigornas e então Check.

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 alguma coisa
}
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