Tutorial: Tempo de Bala no Unity

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!

Filipe Leal

Bacharel em Ciência da Computação pela UDESC e certificado como Microsoft Specialist. Atualmente trabalha como programador na Basecorp Learning Systems. Reside em Edmonton - Canadá. Faixa preta com 1o. grau em Pa-kua, tem preferência por jogos de Ação/Aventura, RPG, Luta e Party Games. Seu jogo favorito é The Legend of Zelda - Ocarina of Time.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *