Tiempo sin escalar
Parte de la sección Creación de juegos reales del Journey de Unity de Coddy. Lección 35 de 56.
Un juego pausado o ralentizado sigue necesitando un reloj real para algunas cosas: un menú de pausa con animaciones, una cuenta regresiva antes de que se reanude la partida, un congelamiento que debe terminar por sí solo. Time.unscaledDeltaTime es el tiempo real desde el último fotograma, sea cual sea el valor de Time.timeScale, y Time.unscaledTime es el tiempo real desde que empezó el juego. Este menú de pausa hace girar su rueda de carga con tiempo real, así que la rueda gira mientras el juego está pausado:
void Update()
{
wheel.Rotate(0f, 0f, -180f * Time.unscaledDeltaTime); // media vuelta por segundo, esté en pausa o no
}Las corrutinas tienen el mismo par. WaitForSeconds cuenta el tiempo del juego, así que con Time.timeScale = 0 nunca termina; WaitForSecondsRealtime cuenta segundos reales. Iniciada cuando se abre el menú, esta corrutina hace parpadear el título del menú cada medio segundo:
IEnumerator Blink()
{
while (true)
{
title.SetActive(!title.activeSelf);
yield return new WaitForSecondsRealtime(0.5f);
}
}Usa los valores escalados para la jugabilidad, que debería detenerse cuando se detiene el juego, y los no escalados para lo que debe ejecutarse mientras está pausado o ralentizado: los menús, sus animaciones y los temporizadores que terminan una pausa. Invoke no tiene una versión de tiempo real: siempre cuenta el tiempo del juego.
Desafío
IntermedioUna pausa de impacto hace que un golpe fuerte se sienta contundente: todo el juego se congela por un momento al impactar. Las flechas mueven el dispositivo que suelta yunques y la barra espaciadora hace que caiga un yunque desde él (Dropper.cs, listo). Escribe Anvil.cs, que lleva cada yunque:
- Cuando el yunque golpee algo, congela el juego:
Time.timeScale0. freezeTimesegundos reales después (0.3 en el Inspector), vuelve a establecerlo en 1.
Pulsa Play, deja caer unos cuantos yunques y, después, pulsa Check.
Pruébalo tú mismo
using System.Collections;
using UnityEngine;
public class Anvil : MonoBehaviour
{
public float freezeTime = 0.3f;
// Congela el juego durante freezeTime segundos reales cuando el yunque golpee algo
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
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ímetro4Escenas y niveles
Cargar una escenaReiniciar el nivelSiguiente nivelConservar entre escenasRepaso: selección de nivel10Proyecto: plataformas 3D
El recorridoPlataformas móviles2Botones 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 infinito
Tres carrilesObstáculos por delante9El nuevo sistema de entrada
Dos sistemas de entradaTeclado y ratónPulsado en este fotogramaAcciones de entradaRepaso: cambio de entrada