Neste tutorial vamos aprender rapidamente como fazer o efeito Tempo de Bala (ou bullet time em inglês) no Unity.
Vamos lá!
Tempo de Bala
O efeito Tempo de Bala, que ficou bastante conhecido após o filme Matrix, é aquele efeito em que tudo parece se movimentar em câmera lenta por alguns segundos. Para fazer o efeito acontecer na vida real, foram utilizadas diversas câmeras posicionadas em uma arena circular. Essas câmeras filmavam a mesma cena de diversos ângulos tornando capaz esse efeito.
Para a nossa alegria, no Unity nós não precisamos ter várias câmeras para fazer esse efeito. Tudo é criado alterando a propriedade Time.timeScale.
Time.timeScale
Esta propriedade controla o tempo no jogo. Você pode usá-la para acelerar uma cena, desacelerar ou até mesmo pausar tudo. O código abaixo é utilizado quando você quer pausar o jogo:
Time.timeScale = 0f;
Muito útil, não?
Mas vamos ao que interessa! Como fazer esse efeito de tempo de bala no Unity!
Preparando a cena
Você pode preparar sua cena do jeito que você quiser. O que vai fazer o efeito é um script simples que controla o timeScale baseado no tempo.
No meu caso aqui, eu criei um cubo para ser o chão, um sistema de partículas simulando uma explosão e adicionei uma animação para a câmera que a faz dar voltas no sistema de partículas. Se vocês quiserem ver em detalhes como fazer animações de câmera, comenta aí que eu monto um tutorial bem bacana!
O resultado foi esse:
Fazendo a mágica acontecer
Criei o seguinte script e adicionei a câmera:
using UnityEngine;
using System.Collections;
public class TempoDeBala : MonoBehaviour {
//Variável que vai ficar contando
//quanto tempo que se passou
float tempoTotal;
void Start () {
//Iniciando com valores padrões
Time.timeScale = 1f;
tempoTotal = 0f;
}
// Update is called once per frame
void Update () {
//Adicionando quanto tempo levou entre um frame e outro
tempoTotal += Time.deltaTime;
//se o tempo total estiver entre 0.2 e 0.5 segundos- Bullet time
if (tempoTotal >= 0.2f && tempoTotal < 0.5f)
Time.timeScale = 0.1f;
//se o tempo total estiver entre 0.7 e 1 segundos- 2x mais rapido
else if (tempoTotal >= 0.7f && tempoTotal < 1f)
Time.timeScale = 2f;
//senao tempo normal
else
Time.timeScale = 1f;
//Se o tempoTotal for maior que 1 segundo,
//resetamos para 0 para que o efeito se repita.
if (tempoTotal > 1f)
tempoTotal = 0f;
}
}
O efeito final ficou assim (a qualidade ruim é porque tive que comprimir o gif para o wordpress aceitar T.T):
É isso aí, pessoal! Abraços e até mais!