Sea of Clouds v2.0

«Sea of Clouds» es el nombre de mi prototipo para la tercera Práctica de Evaluación Continua (PEC3) y para la Práctica Final (FP) de la asignatura Programación de Videojuegos 3D del Máster Universitario en Diseño y Programación de Videojuegos de la UOC.

El objetivo de la práctica era desarrollar un juego de plataformas en tercera persona utilizando los conocimientos adquiridos en el estudio del tercer módulo de la asignatura y realizando investigación por cuenta propia. La práctica final, además, requería ampliar el juego añadiendo mejoras y nuevas características.

Novedades de la práctica final

Como la práctica final es una extensión de la práctica anterior, a continuación se detallan los cambios y mejoras que se han llevado a cabo para poder determinar de manera fácil las diferencias entre ambas:

  • Se ha añadido un submenú de opciones y una pantalla de créditos al menú principal
  • Se ha rehecho completamente la escena de juego
  • Se ha añadido un vehículo controlable por el jugador
  • Se ha añadido vehículos con movimiento autónomo
  • Se ha añadido un nuevo comportamiento para todos los tipos de personaje que hace que exploten si son arrollados por un vehículo
  • Se ha corregido los errores detectados en la práctica anterior

La práctica también ha servido para corregir los errores detectados en la práctica anterior:

  • Los sistemas de partículas asociados a los personajes y objetos ya no se están renderizando por detrás de los elementos del terreno.
  • Las olas del agua que rodea la isla ya no se reflejan en los personajes y enemigos repartidos por la escena.
  • Todos los personajes están completamente sonorizados.
  • No es posible caer a las zonas de muerte.

Además, al final se ha optado por prescindir de la munición y de los diferentes tipos de armas, debido principalmente a la falta de tiempo, pero también porque el diseño del mundo ludoficcional no lo ha contemplado desde el principio y su inclusión hubiera sido forzada. En cualquier caso, tanto el cambio de arma como la gestión de la munición son conceptos que se han aplicado anteriormente en otras prácticas.

Tampoco se ha aplicado el sistema de control de tráfico por motivos similares, dado que la existencia de semáforos u otras señales de tráfico no acaba de encajar con la atmósfera del juego.

Vídeo explicativo (PF)

Vídeo explicativo (PEC3)

Repositorio en GitLab

UOC – M7.458 – PEC3 en GitLab

Versión de Unity

La versión de Unity utilizada para el desarrollo de la práctica es la 2021.3.19f1 LTS.

El orden de las escenas está definido en los builds settings del proyecto, siendo Assets/Scenes/Opening.scene la primera escena que debe cargarse.

Cómo jugar

El objetivo del juego es conseguir tres llaves mientras se esquiva a hordas de monstruos. Una vez conseguidas las tres llaves, aparece un enemigo mayor cuya derrota es el objetivo final del juego.

El control se lleva a cabo mediante teclado y ratón, aunque también está preparado para ser compatible con gamepad:

  • Las letras WASD mueven al personaje.
  • El Espacio hace que el personaje salte.
  • La tecla Mayúsculas izquierda sirve para que el personaje esprinte.
  • El botón derecho del ratón apunta el arco.
  • El botón izquierdo del ratón dispara el arco.
  • El botón central del ratón realiza un ataque cuerpo a cuerpo.
  • La tecla E sirve para entrar y salir del vehículo.
  • La tecla Escape sirve para pausar el juego y abrir el menú de pausa.

Desarrollo

De cara a completar el desarrollo de ambas prácticas, se han llevado a cabo las siguientes tareas obligatorias y opcionales, además de incluir algunos extras que se han ido añadiendo a lo largo del desarrollo.

Tareas obligatorias

  • ✅ Se ha creado un escenario que dispone de zonas urbanas y vegetales.
  • ✅ El personaje dispone de un arma a distancia que le permite disparar hacia delante.
  • ✅ El personaje está completamente animado.
  • ✅❗La salud y la armadura se muestran constantemente en el HUD, pero no la munición.
  • ✅ Los enemigos pasean por la ciudad y atacan al enemigo cuando está cerca.
  • ✅ Los enemigos están completamente animados.
  • ✅ Se dispara un sistema de partículas cuando un personaje (jugador o no) recibe daño o muere.
  • ✅❗Hay objetos de salud y armadura repartidos por el escenario, pero no de munición.
  • ✅ El juego dispone de una pantalla de juego terminado que permite reiniciar la partida.
  • ✅ Los enemigos se mueven entre puntos aleatorios y corren hacia el jugador al detectarlo.
  • ✅ Hay personajes de carácter neutral paseando por el escenario.
  • ✅ Los personajes de carácter neutral huyen de los enemigos.
  • ✅ Se ha creado un menú principal que, además de empezar la partida, permite configurar varios parámetros del juego: volumen general, velocidad del juego y dificultad del juego.
  • ✅ Hay vehículos que se mueven por el escenario.
  • ✅ El jugador puede entrar en los vehículos y desplazarse con ellos.

Tareas opcionales

  • ✅ El juego dispone de al menos un puzle que requiere saltar para progresar.
  • ❌ Se han añadido diferentes tipos de armas.
  • ❌ Las armas están repartidas por el escenario.
  • ✅ El juego está totalmente sonificado.
  • ✅ Se han añadido diferentes tipos de enemigos.
  • ✅ Es posible apuntar al disparar.
  • ✅ El juego dispone de al menos un puzle que requiere obtener llaves para progresar.
  • ✅ El jugador tiene un arma cuerpo a cuerpo.
  • ✅ Los enemigos pueden dejar objetos al morir.
  • ✅ Los enemigos aparecen en varias fuentes del escenario de manera incremental.
  • ✅ Se ha utilizado el componente animation rigging para que el personaje mire hacia los objetos cercanos.
  • ✅ Se ha implementado la iluminación global.
  • ✅ Los personajes de carácter neutral se convierten en enemigos al morir a manos de un enemigo.
  • ❌ Hay un sistema de control del tráfico que limita el movimiento autónomo de los vehículos.
  • ✅ Los NPC y los enemigos explotan si el jugador los atropella a gran velocidad.

Características principales

A continuación se detallan las características más importantes del desarrollo de la práctica.

La escena de juego (PEC3 y PF)

La escena del juego se ha rehecho completamente para la práctica final. Ahora, el escenario consiste en cuatro islas flotantes en un mar de nubes.

  • La isla principal, Gada, situada al suroeste, consiste en una aldea con varios edificios y zonas vegetales. Hay varios NPC repartidos por ella y enemigos que empiezan a aparecer la primera vez que se vuelve a ella. Uno de los enemigos que aparece posee una de las llaves.
  • La isla del sureste, Stria, contiene un templo en el que se encuentra una de las llaves. Para llegar a ella, es necesario resolver un puzle que consiste en abrir varias puertas pisando diferentes interruptores y llegado a una zona inaccesible mediante plataformas.
  • La isla del norte, Voni, contiene un bosque en el que se encuentra la última de las llaves. Hay varios enemigos fuertes repartidos por ella que conviene evitar.
  • Finalmente, la isla del centro, Vanglasaar, contiene una estructura en la que se encuentra el jefe final del juego. Para llegar a él, es necesario haber recogido previamente las tres llaves.

Apuntado, disparo y ataque cuerpo a cuerpo (PEC3)

Para poder disparar el arco, es necesario cargarlo primero. Al hacerlo, el juego bloquea el movimiento del jugador para que no pueda girar con las flechas (sólo desplazarse lateralmente) y enfoca la visión utilizando una segunda cámara. Además, permite apuntar de manera libre a cualquier punto de la escena.

El HUD (PEC3 y PF)

Como en el caso de la práctica anterior, la interfaz de usuario muestra en todo momento la salud y el escudo del jugador, así como las llaves que ha conseguido. También muestra la cruceta y los mensajes enviados por el juego.

Tipos de personaje (PEC3)

A efectos de gestionar de manera transversal las características comunes entre jugador, enemigos y NPC, se ha creado una clase maestra que contiene las propiedades y métodos compartidos y que se apoya en una máquina de estados para manejar el tipo del jugador. Esta aproximación permite, entre otras cosas, poder cambiar fácilmente de tipo a un personaje y se implementa cuando un NPC neutral o aliado se convierte en enemigo al morir. E incluso permitiría al jugador controlar a un NPC o a un enemigo, así como a cualquier otra entidad a la que se extienda la clase.

Se han incluido los tipos siguientes:

  • Player. En este estado, se desactivan las automatizaciones y se activan el character controller y el resto de componentes necesarios para poder jugar.
  • Enemy. En este estado, el personaje deambula por la escena y ataca al jugador y a los NPC neutrales y aliados cuando pasan cerca.
  • Boss. En este estado, el personaje se comporta igual que un enemigo, pero añade la lógica de finalización del juego al derrotarlo.
  • Neutral. En este estado, el personaje deambula por la escena y huye cuando un enemigo pasa cerca.
  • Ally. En este estado, el personaje deambula por la escena y ataca a los enemigos que pasan cerca.

En el caso de los enemigos y los NPC (neutrales y aliados) se han añadido varios tipos con modelos y características diferentes (velocidad, daño, resistencia, etc.).

Objetos y llaves (PEC3)

Como en la práctica anterior, el juego incluye tanto objetos de curación como llaves repartidas por el escenario o dejadas por los enemigos al morir.

Vehículos (PF)

La principal novedad añadida en la práctica final es la inclusión de vehículos. En concreto, se han añadido una nave que permite al jugador desplazarse entre las islas flotantes y que tiene dos estados posibles, ya que, como en el caso de los jugadores, se apoya en una máquina de estados para gestionar su comportamiento y permite cambiar de tipo en tiempo de ejecución:

  • Human. En este estado, el jugador puede controlar la nave y atropellar a los enemigos flotantes.
  • AI. En este estado, la nave se desplaza de manera autónoma en rutas predeterminadas.

El jugador sólo puede subir y bajar del vehículo desde el muelle de cada isla.

Animaciones y rigging (PEC3)

Todos los personajes están completamente disponen de animaciones para todas las posibles combinaciones, aunque no las utilicen, precisamente por la posibilidad de que cualquiera de ellos cambie de tipo. Además, se usan capas y animation events para poder controlar de manera fácil desde el código los momentos en los que se produce algún factor de interés en la reproducción de la animación.

También se ha implementado el animation rigging para el jugador, principalmente para hacer que tanto la cabeza como el torso del personaje miren suavemente hacia los objetos que tienen cerca, pero también para asegurar que el arco mira en todo momento a la posición correcta cuando se está apuntando.

Sistemas de partículas (PEC3)

Se han implementado partículas para un gran número de acciones: al ser golpeado, al morir, al recuperar salud, al convertirse en enemigo, etc.

Inteligencia artificial (PEC3)

Para implementar los objetivos relacionados con la inteligencia artificial, se utiliza una mezcla de NavMesh y de detección de colisiones. Todos los personajes disponen de tres maneras de detectar colisiones: con el collider incorporado al modelo a través del player controller o del capsule collider, con un trigger en un una esfera con un radio de cuatro metros (esfera interna) y por otra con un radio de siete metros (esfera externa). Además, disponen del componente NavMeshAgent para poder navegar por el terreno de manera autómoma.

Teniendo eso en cuenta, el flujo de un personaje normalmente es:

  1. En su estado inicial, a falta de objetivos, el personaje deambula por el escenario desplazándose entre puntos aleatorios con NavMesh.
  2. Cuando otro personaje entra en su esfera interna, lo añade a una lista de objetivos que utiliza para escapar (NPC neutral) o para saber a qué atacar (NPC Aliado, Enemigo y Enemigo final).
  3. Además, si el personaje es atacado por cualquier otro personaje, lo define directamente como objetivo forzado, independientemente de si está o no dentro del rango de detección.
  4. Mientras la lista contiene objetivos, el personaje comprueba qué personaje es el que está más cerca y en base a ello fija un punto de origen del cuál huir (NPC neutral) o fija un punto de destino para atacar (NPC Aliado, Enemigo y Enemigo final).
  5. Si el personaje alcanza a su objetivo, ataca siempre y cuando no exista una determinada distancia entre ambos.
  6. Cuando un objetivo sale de la esfera externa, el personaje lo elimina de la lista de personajes y deja de perseguirlo.
  7. Si la lista de objetivos se vacía, el personaje vuelve a deambular por el escenario.

 

Iluminación global (PEC3)

Finalmente, se ha hecho uso de la iluminación global y el baking para optimizar el uso de la iluminación en la escena de juego y mejorar el rendimiento general.

 

Créditos

Paquetes completos

Fuentes

Música

Shaders

Sonidos

Referencias

C# – General

Unity – General

Animaciones – General

Animaciones – Interrupción

Animaciones – Rigging

Cinemachine

Iluminación

NavMesh

Shaders

Deja un comentario