Con este nuevo tutorial vamos a hacer un juego de ritmo muy sencillo utilizando nuestro plugin AudioAnalyzer para Unreal Engine 4. Intentaremos abordarlo desde un punto de vista tanto teórico como práctico, resolviendo los problemas que pueden surgir en este tipo de juegos.
Diseño y nivel principal
Interfaz de usuario
Game Actor
En un juego de ritmo el jugador debe interactuar con el juego utilizando su sentido del ritmo y su habilidad para presionar botones en un sequencia específica. En la mayoría de los casos esta interacción se realiza utilizando las manos pero tambien nos encontramos juegos que utilizan dispositivos creados específicamente para otras partes como los o incluso el cuerpo entero tan bien.
El juego
En nuestro juego el jugador va a interactuar con una zona circular colocada en el centro de la pantalla.
Los pulsos viajan desde el lado izquierdo hacia el derecho siguiendo una trayectoria que atraviesa esta zona circular. El jugador debe intentar pulsar esta zona cuando el pulso se encuentra dentro para incrementar su puntuación. Si falla, la puntuación sufrirá una penalización.
Vamos a llevar el tracking solo de la banda de baja frecuencia para generar las esferas de los pulsos , en un juego completo podemos poner más zonas con las que interactuar y llevar el tracking de multiples bandas de frecuencia, como las de medias-bajas y medias-altas, y generar los pulsos para cada una de las zonas de manera independiente. Puede convertirse en un gran reto para el jugador
El proyecto de UE4
Comenzamos creando un nuevo proyecto vacio.
Una vez tenemos el plugin instalado para nuestro engine nuestro siguiente paso es activar el plugin AudioAnalyzer en Editor > Plugins.
Ahora podemos ir creando una carpeta donde vamos a colocar nuestra música. Esta carpeta necesita ser incluida manualmente a la lista de directorios a incluir cuando se empaqueta el juego. En Packaging > Additional Non-asses Directories to Package podemos añadir nuestra nueva carpeta.
En esta carpeta podemos ir poniendo ya un fichero de audio de ejemplo, vamos a escoger uno con la frecuencias en las que vamos a realizar el tracking muy claras para facilitarnos la calibración del juego. Después de esta calibración podemos testear el juego con una canción real.
Tenemos que empezar creando una clase blueprint con clase base Audio Analyzer Manager . Click derecho en carpeta content > Blueprint Class > Buscamos la clase AudioAnalyzerManager > Select
Esta instancia Blueprint se utilizará para construir nuestros objetos Audio Analyzer Manager.
El encargado de controlar la lógica del juego será un objeto Actor (tserá nuestro blueprint BP_Game), el mapa del nivel solo contendrá este actor y una camara.
El BP_Game tendrá que contener los widgets de la interfaz gráfica y otro Actor, el BP_Game_dealer, esta clase se encargará de ir generando los Actores que representarán los pulsos (BP_Game_dealer_beat).
Vamos a crear dos objectos para gestionar el audio (BP_AAManager), uno para reproducir la canción y otro para llevar el análisis unos segundos por delante de la posición de reproduccion. Para reproducir otros sonidos que no requieren ningun análisis como los efectos en los botones del menu utilizaremos el motor de audio del unreal engine.
Podríamos crear ambas variables directamente en el blueprint BP_Game pero envez de eso vamos a utilizar el objeto GameInstance para guardar estas variables.
Para crear el objeto de instancia del juego hacemos click derecho en el explorador de contenido > Blueprint Class y buscamos GameInstance.
La instancia de juego no se destruye al cambiar los niveles, para este juego en concreto nos da un poco igual esta funcionalidad, pero si piensas tener, por ejemplo, un nivel para el menu inicial y diferentes niveles de juego esta es la manera correcta de abordarlo. Otra ventaja de este objeto es que se puede acceder a el desde cualquier otro blueprint, esto puede resultar muy útil.
Por lo tanto vamos a crear una clase GameInstance con los dos gestores de audio, las rutas a los ficheros de audio, la puntuación, y una referencia a nuestro actor principal del juego (la instancia BP_Game), esta referencia nos resultará muy útil para utilizar los métodos de este actor desde el widget de la interfaz de usuario sin tener que pasarle la referencia directamente, por ejemplo para pausar y reanudar la reproducción del audio..
Para acceder a estas variables dedde cualquier blueprint tenemos que obtener la instancia con el nodo GetGameInstance y realizar un cast a nuestra implementacion específica de la instancia de juego.
Vamos a añadir un método para construir (Construct Object from Class) nuestros gestores de audio, estableciendo la misma instancia de juego como Outer class. Este método será llamado cuando el juego comience y enlazará el tiempo de vida de los gestores con el tiempo de vida de la instancia de juego.
Una vez hemos terminado la creación de la instancia de juego tenemos que seleccionarla en la configuración de proyecto. Maps & Modes > Game Instance > Game Instance Class
Podemos Guardar el nivel y establecerlo como nivel por defecto del juego, en esta misma sección, antes de ponernos con el diseño de la interfaz de usuario y el actor principal del juego.
Ahora podemos continuar con la parte más interesante del desarrollo de videojuegos.
Continúa en Parte 2: Interfaz de usuario
Tutorial files
Te puede interesar:
Ayudanos con este blog!
El último año he estado dedicando cada vez más tiempo a la creación de tutoriales, en su mayoria sobre desarrollo de videojuegos. Si crees que estos posts te han ayudado de alguna manera o incluso inspirado, por favor considera ayudarnos a mantener este blog con alguna de estas opciones. Gracias por hacerlo posible!