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.
Desafio
MédioJogue o voo do cometa pela SlowZone em câmera lenta.
- Em
SlowZone.cs, escrevavoid OnTriggerEnter(Collider other): definaTime.timeScalecomoslowScaleeTime.fixedDeltaTimecomo0.02f * slowScale. - Escreva
void OnTriggerExit(Collider other): defina-os novamente como1fe0.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
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