Menu
CoddyTech

Câmera lenta

Parte da seção Criando Jogos de Verdade do Journey de Unity da Coddy. Lição 35 de 60.

Um Time.timeScale entre 0 e 1 é câmera lenta. Em 0.25, Time.deltaTime é um quarto do tempo real de cada quadro, então um carro movido por speed * Time.deltaTime percorre um quarto da distância a cada segundo real, os corpos rígidos voam e caem a um quarto da velocidade, e WaitForSeconds(1f) dura 4 segundos reais. Acima de 1, o jogo roda mais rápido: 2 significa o dobro da velocidade.

A física precisa de mais uma linha. Cada etapa da física ainda avança o jogo em Time.fixedDeltaTime, 0.02 segundos de tempo de jogo, e em 0.25 isso leva 0.08 segundos reais: FixedUpdate() é executado apenas 12.5 vezes por segundo real, então os corpos se movem a cada cinco quadros e tremem. Reduza a etapa pelo mesmo fator e restaure os dois valores depois, pois o Unity nunca redefine fixedDeltaTime por conta própria. Este script desacelera o jogo enquanto a tecla Space estiver pressionada:

float normalStep;

void Awake()
{
    normalStep = Time.fixedDeltaTime;   // 0.02 em um projeto novo
}

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        Time.timeScale = 0.25f;
        Time.fixedDeltaTime = normalStep * Time.timeScale;
    }
    if (Input.GetKeyUp(KeyCode.Space))
    {
        Time.timeScale = 1f;
        Time.fixedDeltaTime = normalStep;
    }
}

Com a etapa menor, a física ainda é executada 50 vezes por segundo real e cada etapa cobre um quarto do tempo de jogo, então a câmera lenta continua suave. A etapa é medida em segundos de jogo, então o código em FixedUpdate() que usa Time.deltaTime continua funcionando sem alterações.

challenge icon

Desafio

Médio

Jogue o voo do cometa pela SlowZone em câmera lenta.

  1. Em SlowZone.cs, escreva void OnTriggerEnter(Collider other): defina Time.timeScale como slowScale e Time.fixedDeltaTime como 0.02f * slowScale.
  2. Escreva void OnTriggerExit(Collider other): defina-os novamente como 1f e 0.02f.

Pressione “Jogar” e Espaço: o cometa desliza pela zona a uma velocidade de 0.4. Depois, clique em “Verificar”.

Experimente você mesmo

using UnityEngine;

public class SlowZone : MonoBehaviour
{
    public float slowScale = 0.4f;

    // Câmera lenta enquanto algo estiver dentro da zona
}

Todas as lições de Criando Jogos de Verdade

Pratique por conta própria: Playground de Unity