En este tutorial, construiremos un juego simple donde el jugador puede rebobinar Progreso en la unidad (también se puede adaptar para trabajar en otros sistemas). Esta primera parte se centrará en los aspectos básicos del sistema, y la siguiente parte lo desarrollará y lo hará mucho más versátil..
Primero, aunque echaremos un vistazo a qué juegos usan esto. Luego veremos los otros usos de esta configuración técnica, antes de crear un juego pequeño que podamos rebobinar, lo que le dará una base para su propia configuración..
Una estación demoníaca de la funcionalidad básica.Necesitarás la versión más reciente de Unity para esto, y deberías tener algo de experiencia con ella. El código fuente también está disponible para su descarga si desea verificar su propio progreso en relación con él..
Listo? Vamonos!
Principe de Persia: Las arenas del tiempo es uno de los primeros juegos en integrar realmente una mecánica de rebobinado del tiempo en su juego. Cuando mueras, no solo tienes que recargar, sino que puedes rebobinar el juego durante unos segundos hasta que estuvieras vivo de nuevo e intentarlo de inmediato..
Príncipe de Persia las arenas olvidadas. los Arenas del tiempo La trilogía integra el rebobinado del tiempo a la perfección en su juego y evita la recarga rápida que rompe la inmersión.Esta mecánica no solo está integrada en el juego, sino también en la narrativa y el universo, y se menciona a lo largo de la historia..
Otros juegos que emplean estos sistemas son Trenza, por ejemplo, que también se centra en el devanado del tiempo. El héroe trazador en Overwatch tiene un poder que la restablece a una posición hace unos segundos, esencialmente rebobinado Su tiempo, incluso en un juego multijugador. los CUADRÍCULA-La serie de juegos de carreras también tiene una mecánica instantánea, en la que tienes un pequeño grupo de rebotes durante una carrera, a la que puedes acceder cuando tienes un choque crítico. Esto evita la frustración causada por choques cerca del final de la carrera, lo que puede ser especialmente irritante..
Pero este sistema no solo se puede utilizar para reemplazar el ahorro rápido. Otra forma en la que se emplea esto es el fantasma en los juegos de carreras y el multijugador asíncrono.
Las repeticiones son otra forma divertida de emplear esta función. Esto se puede ver en juegos como SUPER CALIENTE, la Gusanos Series, y casi la mayoría de los juegos deportivos..
Las repeticiones de deportes funcionan de la misma manera que se presentan en la televisión, donde se muestra una acción nuevamente, posiblemente desde un ángulo diferente. Para esto no se graba un video, sino las acciones del usuario, lo que permite que la reproducción emplee diferentes ángulos de cámara y tomas. Los juegos de Worms usan esto de una manera humorística, donde se muestran muertes muy cómicas o efectivas en una Repetición instantánea.
SUPERHOT también registra tu movimiento. Cuando termina de jugar, todo su progreso se vuelve a reproducir, mostrando los pocos segundos de movimiento real que sucedieron..
Super Meat Boy usa esto de una manera divertida. Cuando terminas un nivel, ves una repetición de todos tus intentos anteriores colocados uno encima del otro, culminando con tu carrera final como la última que queda en pie..
La repetición de final de nivel en chico súper carne. Cada uno de sus intentos anteriores se registra y luego se reproduce al mismo tiempo.Fantasma de raza Es una técnica en la que compites por el mejor tiempo en una pista vacía. Pero al mismo tiempo, compites contra un fantasma, que es un automóvil fantasmal y transparente, que conduce la manera exacta en que corriste antes en tu mejor intento. No puedes chocar con él, lo que significa que aún puedes concentrarte en conseguir el mejor momento.
En lugar de conducir solo llegas a competir contra ti mismo, lo que hace que las pruebas de tiempo sean mucho más divertidas. Esta característica aparece en la mayoría de los juegos de carreras, desde el Necesidad de la velocidad series a Diddy Kong Racing.
Compitiendo con un fantasma en Naciones Trackmania. Esta tiene la dificultad de plata, lo que significa que obtendré la medalla de plata si las derroto. Note la superposición en los modelos de autos, mostrando que el fantasma no es corpóreo y puede ser manejado.Asynchronous Multiplayer-Ghosting es otra forma de utilizar esta configuración. En esta característica raramente utilizada, las partidas multijugador se logran registrando los datos de un jugador, quien luego envía su carrera a otro jugador, quien puede luchar posteriormente. en contra el primer jugador Los datos se aplican de la misma forma que lo haría un fantasma de contrarreloj, solo que estás compitiendo contra otro jugador..
Una forma de esto aparece en el Trackmania-Juegos, donde es posible competir contra ciertas dificultades. Estos corredores registrados te darán un oponente para vencer por una cierta recompensa..
Pocos juegos ofrecen esto desde el primer momento, pero si se usan bien, puede ser una herramienta divertida..Team Fortress 2 ofrece un editor de reproducción incorporado, con el que puede crear sus propios clips.
El editor de repeticiones de Team Fortress 2. Una vez registrado, se puede ver un partido desde cualquier perspectiva, no solo del jugador..Una vez que se haya activado la función, puede grabar y ver partidos anteriores. El elemento vital es que todo Se graba, no solo tu vista. Esto significa que puedes moverte por el mundo del juego registrado, ver dónde están todos, y tener control sobre el tiempo.
Para probar este sistema, necesitamos un juego simple donde podamos probarlo. Vamos a crear uno!
Crea un cubo en tu escena, este será nuestro personaje jugador. Luego crea un nuevo C # -script de llamadas Jugador.cs
y adaptar el Actualizar()
-funciona para parecerse a esto:
void Update () transform.Translate (Vector3.forward * 3.0f * Time.deltaTime * Input.GetAxis ("Vertical")); transform.Rotate (Vector3.up * 200.0f * Time.deltaTime * Input.GetAxis ("Horizontal"));
Esto manejará el movimiento simple a través de las teclas de flecha. Adjunte este script al cubo del jugador. Cuando ahora tocas el juego ya deberías poder moverte..
Luego, incline la cámara para que vea el cubo desde arriba, con espacio de lado donde podamos moverlo. Por último, crea un plano para actuar como piso y asigne algunos materiales diferentes a cada objeto, para que no lo movamos dentro de un vacío. Debe tener un aspecto como este:
Pruébelo, y debería poder mover su cubo utilizando WSAD y las teclas de flecha.
Ahora crea un nuevo script C # llamado TimeController.cs
y agregarlo a un nuevo GameObject vacío. Esto manejará la grabación real y el posterior rebobinado del juego..
Para hacer que esto funcione, registraremos el movimiento del personaje del jugador. Cuando luego presionamos el botón de rebobinar, adaptaremos las coordenadas del jugador. Para hacerlo, comienza creando una variable para sostener al jugador, como esto:
jugador de GameObject público;
Y asigne el objeto de jugador a la ranura resultante en el TimeController, para que pueda acceder al jugador y sus datos.
Luego necesitamos crear una matriz para mantener los datos del jugador:
ArrayList público Posiciones; void Start () playerPositions = new ArrayList ();
Lo que haremos a continuación es registrar continuamente la posición del jugador. Tendremos almacenada la posición de donde estaba el jugador en el último cuadro, la posición donde estaba el jugador hace 6 cuadros y la posición donde estaba el jugador hace 8 segundos (o por mucho tiempo que lo configures para grabar). Cuando más tarde pulsemos un botón, retrocederemos a través de nuestro conjunto de posiciones y le asignaremos cuadro por cuadro, lo que resultará en una función de rebobinado del tiempo..
Primero, vamos a guardar los datos:
void FixedUpdate () playerPositions.Add (player.transform.position);
En el FixedUpdate ()
-función de registro de los datos. FixedUpdate ()
se utiliza cuando se ejecuta a una velocidad constante de 50 ciclos por segundo (o lo que sea que establezca), lo que permite un intervalo fijo para registrar y configurar los datos. los Actualizar()
-mientras tanto, la función se ejecuta dependiendo de cuántos cuadros maneja la CPU, lo que haría las cosas más difíciles.
Este código almacenará la posición del jugador de cada cuadro en la matriz. Ahora necesitamos aplicarlo.!
Agregaremos un cheque para ver si se presionó el botón de rebobinado. Para esto, necesitamos una variable booleana:
public bool isReversing = false;
Y un cheque en el Actualizar()
-función para configurarlo de acuerdo a si queremos rebobinar el juego:
nula Actualización () si (Input.GetKey (KeyCode.Space)) isReversing = true; else isReversing = false;
Para hacer correr el juego. hacia atrás, Aplicaremos los datos en lugar de grabar.. El nuevo código para registrar y aplicar la posición del jugador debe tener este aspecto:
void FixedUpdate () if (! isReversing) playerPositions.Add (player.transform.position); else player.transform.position = (Vector3) playerPositions [playerPositions.Count - 1]; playerPositions.RemoveAt (playerPositions.Count - 1);
Y todo Controlador de tiempo
-guión como este:
utilizando UnityEngine; utilizando System.Collections; controlador de tiempo de clase pública: MonoBehaviour jugador de GameObject público; ArrayList público Posiciones; public bool isReversing = false; void Start () playerPositions = new ArrayList (); void Update () if (Input.GetKey (KeyCode.Space)) isReversing = true; else isReversing = false; void FixedUpdate () if (! isReversing) playerPositions.Add (player.transform.position); else player.transform.position = (Vector3) playerPositions [playerPositions.Count - 1]; playerPositions.RemoveAt (playerPositions.Count - 1);
Además, no olvide añadir un cheque a la jugador
-clase para ver si el Controlador de tiempo
Actualmente se está rebobinando o no, y solo se mueve cuando no está retrocediendo. De lo contrario, podría crear un comportamiento de buggy:
utilizando UnityEngine; utilizando System.Collections; Jugador de clase pública: MonoBehaviour controlador de tiempo de TimeController privado; void Start () timeController = FindObjectOfType (typeof (TimeController)) como TimeController; void Update () if (! timeController.isReversing) transform.Translate (Vector3.forward * 3.0f * Time.deltaTime * Input.GetAxis ("Vertical")); transform.Rotate (Vector3.up * 200.0f * Time.deltaTime * Input.GetAxis ("Horizontal"));
Estas nuevas líneas encontrarán automáticamente la Controlador de tiempo
-Objeto en la escena en el inicio y verifíquelo durante el tiempo de ejecución para ver si actualmente estamos jugando el juego o rebobinándolo. Solo podemos controlar el personaje cuando actualmente no estamos invirtiendo el tiempo..
Ahora deberías poder moverte por el mundo y rebobinar tu movimiento presionando espacio. Si descarga el paquete de compilación adjunto a este artículo y abre TimeRewindingFunctionality01 puedes probarlo!
Pero espera, ¿por qué nuestro simple jugador-cubo sigue mirando en la última dirección en que los dejamos? Porque no conseguimos grabar también su rotación.!
Para eso necesitas otra matriz para mantener sus valores de rotación, para crear una instancia al principio, y para guardar y aplicar los datos de la misma manera que manejamos los datos de posición..
utilizando UnityEngine; utilizando System.Collections; controlador de tiempo de clase pública: MonoBehaviour jugador de GameObject público; ArrayList público Posiciones; jugador ArrayList jugadorRotaciones; public bool isReversing = false; void Start () playerPositions = new ArrayList (); playerRotations = new ArrayList (); void Update () if (Input.GetKey (KeyCode.Space)) isReversing = true; else isReversing = false; void FixedUpdate () if (! isReversing) playerPositions.Add (player.transform.position); playerRotations.Add (player.transform.localEulerAngles); else player.transform.position = (Vector3) playerPositions [playerPositions.Count - 1]; playerPositions.RemoveAt (playerPositions.Count - 1); player.transform.localEulerAngles = (Vector3) playerRotations [playerRotations.Count - 1]; playerRotations.RemoveAt (playerRotations.Count - 1);
Pruébalo! TimeRewindingFunctionality02 Es la versión mejorada. Ahora nuestro jugador-cubo puede retroceder en el tiempo, y se verá igual que cuando estaba en ese momento..
Hemos construido un prototipo de juego simple con un sistema de rebobinado de tiempo ya utilizable, pero aún está lejos de terminar. En la siguiente parte de esta serie, la haremos mucho más estable y versátil, y agregaremos algunos efectos nítidos..
Esto es lo que todavía tenemos que hacer:
También veremos cómo extender este sistema más allá del carácter del jugador: