Juego de carreras

Vídeo

Vídeo explicativo del juego.

Escenas

Usando la herramienta Terrains de Unity podemos crear la orografía de forma sencilla. En este ejemplo he creado dos circuitos de muestra.
La parte urbana la he implementado usando edificios prefabricados.

Fuera de pista

Lo he implementado añadiendo un collider en modo trigger en el coche.
He creado el tag Road para facilitar la detección de la carretera del collider.


Con un pequeño script monitorizo cuando el collider sale de la carretera y cuando vuelve a entrar. Cuando sale manda activar el bool isOffRoad del CarUserControl.
Una pequeña modificación del FixedUpdate del script CarUserControl modifica el input de control en función de si está o no offroad. Si está off road, limitará el acelerador y añadirá una componente de freno a cualquier input que se esté recibiendo.

Fantasma

La gestión del fantasma la he implementado guardando la posición y orientación de cada coche cada cierto tiempo. Cuando se cargan los datos automáticamente se interpola la posición y rotación para mostrar un movimiento suave y natural.

He añadido un prefab de coche fantasma eliminando todas las componentes del vehículo original menos los mesh renders.
He añadido un script para pintar el fantasma según convenga dependiendo de los colores del coche del jugador. Para poder pintar el material transparente he creado un material con render mode transparente.
El script coloreará este material igual que el color original, modificará el alpha y volverá a asignar a la parte correspondiente.

El script GhostLapSaver se encarga de registrar el fantasma desde el paso anterior por meta y el siguiente, comprueba si el tiempo es mejor que la vuelta rápida anterior y la actualiza en caso afirmativo. Guarda directamente la vuelta rápida en un archivo.

El script GhostLapLoader busca el archivo de la vuelta rápida del jugador, si le encuentra, lo carga directamente en la primera vuelta. Por cada paso por meta, carga la vuelta rápida y la empieza a reproducir desde que el jugador pasa por meta.
He añadido una variable para poder controlar el adelanto del coche fantasma respecto al jugador, para poder tenerlo de referencia. En la versión final se podrá configurar fácilmente desde el menú configuración (actualmente no implementado).

En el menú del juego, podemos ver el tiempo de la vuelta rápida junto con la posibilidad de borrarlo.
En mi juego, el fantasma se activa en la primera carrera, después de completar una vuelta. Se actualizará si se consigue una vuelta más rápida.

Repetición

Una vez terminada la carrera aparecerá un menú, dicho menú permitirá reiniciar la carrera, cargar la repetición, o salir al menú principal.
Si se selecciona repetición, se cargará el UI de gestión de la repetición. Consta de 4 grupos de acciones:

  • La primera para seleccionar el conductor a seguir.
  • La segunda para controlar la reproducción.
  • La tercera para gestionar la velocidad de reproducción.
  • La última para seleccionar la cámara o el modo automático.

Selección de conductor:

Dos botones permiten pasar al anterior o al siguiente conductor.
En el centro, se mostrará el nombre del conductor.

Control de reproducción:

Tres botones permiten el control de la reproducción,
retroceder, empezar replay/ pausar replay y avanzar.

Control de velocidad de reproducción:

Dos botones permiten pasar a la anterior o a la siguiente velocidad.
En el centro, se mostrará la velocidad.
Las velocidades implementadas son x1, x2, x5, x10. Se pueden modificar fácilmente modificando el array de configuración.

Selección de cámara:

Dos botones permiten pasar a la anterior o a la siguiente cámara. La cámara se configurará con el target adecuado.
En el centro, se mostrará el nombre de la cámara.
Todas las cámaras virtuales tienen el script CameraController que ayuda a la gestión de la misma. Con un bool configurable podemos hacer que una cámara siga o no al objetivo.
Otro bool permite controlar si mirará o no al target. Por si nos interesa una cámara fija en una curva.
Las transiciones se han configurado en el componente CinemachineBrain añadiendo custom blends. De esta forma podemos controlar los tiempos de blend o cambiar de cámara al corte.

Tabla de tiempos

He diseñado un panel de tiempos con las funciones solicitadas:

  • Contador de vueltas.
  • Tiempo de la vuelta actual.
  • Tiempo de la vuelta rápida.
  • Tabla de tiempos.

Cada uno de los paneles tiene su propio scrip que controla los componentes del UI. De esta forma puedo controlar la transformación del tiempo (un float) en el sistema sexagesimal.
La tabla de tiempos se puede configurar para mostrar las x últimas vueltas. Como el enunciado pide las 2 últimas, se ha dejado en este número.

He creado el scriptable object TimeTable. Este objeto guardará la información de cada vuelta, con el número de vuelta y el tiempo. Tiene el evento OnAddNewLap. Este evento facilita la gestión de la tabla de tiempos durante la carrera.
Suscribiéndose a ese evento, se llama automáticamente al método encargado de actualizarlo.

Deja un comentario