Cámara lenta
Parte de la sección Creación de juegos reales del Journey de Unity de Coddy. Lección 35 de 60.
Un valor de Time.timeScale entre 0 y 1 produce cámara lenta. Con 0.25, Time.deltaTime es un cuarto del tiempo real de cada fotograma, así que un coche que se mueve mediante speed * Time.deltaTime recorre un cuarto de la distancia cada segundo real, los Rigidbody vuelan y caen a un cuarto de su velocidad, y WaitForSeconds(1f) dura 4 segundos reales. Por encima de 1, el juego se ejecuta más rápido: 2 es el doble de velocidad.
La física necesita una línea más. Cada paso de física sigue avanzando el juego en Time.fixedDeltaTime, es decir, 0.02 segundos de tiempo de juego, y con 0.25 esos pasos tardan 0.08 segundos reales: FixedUpdate() se ejecuta solo 12.5 veces por segundo real, así que los cuerpos se mueven un fotograma de cada cinco y dan tirones. Reduce el paso por el mismo factor y, después, restablece ambos valores, ya que Unity nunca restablece fixedDeltaTime por sí solo. Este script ralentiza el juego mientras mantienes pulsada la tecla Espacio:
float normalStep;
void Awake()
{
normalStep = Time.fixedDeltaTime; // 0.02 en un proyecto nuevo
}
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;
}
}Con el paso más pequeño, la física sigue avanzando 50 veces por segundo real y cada paso abarca un cuarto del tiempo de juego, por lo que la cámara lenta se mantiene fluida. El paso se mide en segundos de juego, así que el código de FixedUpdate() que usa Time.deltaTime sigue funcionando sin cambios.
Desafío
IntermedioReproduce a cámara lenta el vuelo del cometa a través de SlowZone.
- En
SlowZone.cs, escribevoid OnTriggerEnter(Collider other): estableceTime.timeScaleenslowScaleyTime.fixedDeltaTimeen0.02f * slowScale. - Escribe
void OnTriggerExit(Collider other): restablécelos en1fy0.02f.
Pulsa «Jugar» y la barra espaciadora: el cometa se desliza por la zona a una velocidad de 0.4. Después, pulsa «Comprobar».
Pruébalo tú mismo
using UnityEngine;
public class SlowZone : MonoBehaviour
{
public float slowScale = 0.4f;
// Cámara lenta mientras haya algo dentro de la zona
}
Todas las lecciones de Creación de juegos reales
1Texto en pantalla
Canvas y textoMuestra la puntuaciónDa formato a los númerosUn temporizador de cuenta regresivaRepaso: velocímetro2Botones y pantallas
Botones y onClickLambdasConectar en el InspectorPaneles activados y desactivadosBarras de saludRepaso: tienda de mejoras5Guardar con PlayerPrefs
Guardar un númeroCargar con un valor predeterminadoPuntuación más altaGuardar ajustesRepaso: monedas en el banco3El gestor del juego
Un solo script ejecuta el juegoEl SingletonEstados del juegoActivar el estadoRepaso: gestor de rondas6Proyecto: Corredor sin fin
Tres carrilesObstáculos por delante9El nuevo sistema de entrada
Dos sistemas de entradaTeclado y ratónPulsado en este fotogramaAcciones de entradaRepaso: cambio de entradaPractica por tu cuenta: Playground de Unity