Tiempo sin escalar
Parte de la sección Creación de juegos reales del Journey de Unity de Coddy. Lección 36 de 60.
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 el juego continúe, un congelamiento que debe terminar por sí solo. Time.unscaledDeltaTime es el tiempo real transcurrido desde el último fotograma, sea cual sea el valor de Time.timeScale, y Time.unscaledTime es el tiempo real transcurrido 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 seguir funcionando mientras está pausado o ralentizado: los menús, sus animaciones y los temporizadores que ponen fin a una pausa. Invoke no tiene una versión de tiempo real: siempre cuenta el tiempo del juego.
Desafío
IntermedioDale al yunque una pausa al impactar: todo el juego se congela por un momento cuando cae.
- En
Anvil.cs, escribeIEnumerator HitStop():Time.timeScale = 0f;, despuésyield return new WaitForSecondsRealtime(freezeTime);, y después vuelve a establecerlo en1f. - Escribe
void OnCollisionEnter(Collision collision)que llame aStartCoroutine(HitStop());.
Pulsa «Jugar» y deja caer yunques con la barra espaciadora: cada aterrizaje congela el juego durante 0.3 segundos. Después, pulsa «Comprobar».
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
}
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