Comunidad orientada al desarrollo de videojuegos

Introducción a Unreal Blueprint

En esta serie de artículos vamos a realizar un recorrido por los aspectos más interesantes de la nueva herramienta de programación visual que incorpora Unreal Engine 4 y que sustituye (y hace olvidar inmediatamente) a Kismet. Además, hablaré de mis experiencias utilizando dicha herramienta y mostraré “recetas” que estamos utilizando en el desarrollo de Aegis Down.

¿Qué es Blueprint?

Cualquiera que haya trabajado con UDK conocerá sin duda la herramienta Kismet, con la que se podían definir comportamientos de jugabilidad y crear simples funcionalidades para juegos pequeños o prototipos. Aun así, Kismet contaba con profundas desventajas y aspectos negativos, por lo que resultaba prácticamente imposible hacer cosas complejas para nuestros proyectos. Además, Kismet operaba sobre un único nivel, y por lo tanto toda la funcionalidad que quisiéramos utilizar en otro nivel o mapa había de ser copiada a dicho nivel, perdiendo así uno de los aspectos más importantes en cualquier herramienta de programación moderna: la capacidad de reutilizar componentes.

Con la nueva versión de Unreal Engine, Epic ha querido dotar a los desarrolladores y diseñadores de niveles de una potente herramienta visual que nos permitirá crear muchas de las funcionalidades de nuestro juego de manera visual y autoexplicativa.  Aunque no se pretende que Blueprint sustituya en ningún momento a la programación en C++, ambos sistemas están tan perfectamente integrados entre sí que nos resultará sumamente sencillo crear y definir el comportamiento de nuestro juego.

De este modo, y en el caso concreto de Aegis Down, hemos optado por introducir Blueprint como parte importante del desarrollo del mismo pues, aunque finalmente haya aspectos clave que tengan que ser programadas a la vieja usanza, se trata de una forma sólida y rápida de conseguir avances.

Finalmente y a modo de cierre de esta introducción, quisiera añadir que durante un intercambio de tweets con Ray Davies (uno de los desarrolladores de Epic encargados de Unreal Engine), me aclaró su postura personal sobre el uso de esta herramienta. Según el señor Davies, ambos sistemas pueden y deben convivir (y ser utilizados) durante el desarrollo de un proyecto. Yo añado que descartar Blueprint simplemente por no ser un lenguaje de programación al uso sería un tremendo error, dado que además de ofrecer casi toda la funcionalidad de Unreal de una manera flexible y accesible, ha sido dotado de extensibilidad, herencia y otros aspectos propios de los lenguajes modernos. Por si fuera poco, podemos utilizar C++ para añadir funciones base, lo que amplía la potencia y versatilidad del sistema.  Además, Blueprint se ha convertido en una parte principal del desarrollo en Unreal Engine 4, siendo utilizado no sólo para crear funcionalidad en los niveles, sino también para definir clases y plantillas con comportamiento autodefinidos (a modo de los antiguos prefabs pero con la posibilidad de incluir procedimientos que añadan comportamiento, eventos e interacción  entre sus componentes). Incluso el nuevo sistema de animaciones se gestiona con Blueprint.

Usos de Blueprint

Como he descrito más arriba, Blueprint ha sido elegido como componente principal en el desarrollo sobre Unreal Engine 4. Vamos a desglosar el uso de esta herramienta dentro del motor para obtener una visión general de sus capacidades y versatilidad, antes de entrar en más detalles.

Plantillas (denominados simplemente Blueprints)

Todo objeto capaz de interactuar con el mundo de juego es susceptible (y de hecho es lo deseable) de ser convertido en una instancia de Blueprint. Desde el propio personaje principal hasta los enemigos, pasando por los controladores de IA, el HUD, armas, ítems que el personaje puede recoger e incluso el mismísimo GameType o el GameState.

Se pueden crear Blueprints que hereden de casi cualquier clase incluida en el motor y añadan o sustituyan la funcionalidad de la misma, así como crear Blueprints que hereden de otros Blueprints. De este modo, disponemos de herencia de clases de una forma visual y potente. Por ejemplo, podríamos crear un Blueprint que defina el comportamiento y los componentes base de un enemigo, y crear otro que herede de éste para modificar algunos aspectos, por ejemplo el modelo enemigo, sus estadísticas de combate o su comportamiento, tal y como lo haríamos si lo programamos en C++.

Ni que decir tiene que es un gran avance para los desarrolladores, ya que permite definir muchos aspectos de nuestro juego de una forma rápida y visual. Además, podremos crear nuestras propias clases base para nuestro juego y posteriormente heredar de estas con Blueprint.

En el caso de prefabs, podríamos por ejemplo crear un Blueprint que represente una antorcha y que esté compuesto por todos los componentes necesarios para la misma, como el modelo, el componente de iluminación y un emisor de partículas para el fuego. Sólo habría que seleccionar dicho Blueprint y colocarlo donde queramos en el nivel, y tendríamos nuestra antorcha perfectamente funcional. Incluso podríamos definir comportamiento propio, como que la luz parpadee cada pocos segundos, o que la antorcha se apague de repente al paso del jugador. Lo más importante de todo esto es que si realizamos un cambio en nuestro Blueprint Antorcha, dicho cambio se aplicaría a todas las instancias colocadas en cualquier nivel del juego.

Vamos a ver un ejemplo de este tipo de Blueprints con uno de los componentes principales de Aegis Down: la espada de Khan.

Blueprint Template 1

En la imagen superior podemos ver los componentes que forman este Blueprint: el Skeletal Mesh que representa a la espada, un componente de colisión para detectar los impactos y un emisor de partículas para el efecto trail de la hoja durante los ataques. Una vez que todo está en su sitio y con sus valores definidos correctamente, podemos añadir funcionalidad propia a este Blueprint.

Blueprint Template 2

En este caso en particular, necesitamos controlar si se ha producido un impacto durante alguno de los ataques (que se efectúan en el Blueprint del personaje principal) y aplicar el daño en consecuencia. Además, necesitamos controlar el estado de la espada para que no vaya realizando detecciones si no hay un ataque en curso.

Como se puede observar en estas dos capturas, la forma de trabajar con este tipo de Blueprints es bastante visual a la vez que potente, ya que nos permite controlar perfectamente el comportamiento necesario del objeto de juego.

Animaciones

El viejo y complejo AnimTree ha sido rediseñado desde cero buscando la flexibilidad y la facilidad de comprensión y diseño. Gracias a Blueprint, el nuevo sistema de animaciones (denominado en su conjunto como Persona) se ha convertido en una herramienta muy poderosa y que evita la complejidad del sistema anterior. Trataré con ejemplos sobre Blueprints de animaciones en futuras entregas, pero basta decir que ha mejorado bastante y agiliza mucho la creación de un árbol de animaciones complejo.

Además del Gráfico de Eventos, el Blueprint de animaciones incorpora un Gráfico de Animaciones donde modelar las transiciones y estados de nuestro árbol. Con la unión de dichos gráficos podemos conseguir todos los resultados que necesitemos respecto a las animaciones de nuestros modelos. Por supuesto, incorpora un previsualizador del Skeletal Mesh para ver una simulación del estado de las animaciones.

Blueprint Anim 1

Blueprint Anim 2
Niveles

El viejo Kismet ya nos ofrecía la posibilidad de crear comportamientos referentes a nuestros niveles de juego, como por ejemplo disparar una trampa, lanzar una cinemática o definir una transición a otro mapa cuando el jugador llegue a un punto en concreto. Evidentemente, con Blueprint podremos realizar todas estas tareas, aunque mejor y más rápido. Además, podremos crear Blueprints que podrán ser utilizados desde cualquier nivel de nuestro juego, por lo que podríamos, por ejemplo, crear una función que se encargue de generar enemigos y ubicarlos en un punto en concreto del mapa, que pasaremos como referencia desde el Blueprint de nuestro nivel.

level blueprint

Como se puede observar en la imagen superior, estamos accediendo al Blueprint que gestiona nuestro juego (ADGame) e invocando la función SpawnEnemy pasando como argumentos a dicha función dos TargetPoints ubicados en nuestro nivel. La función SpawnEnemy (definida por mí en otro Blueprint) creará un enemigo en el punto A indicado y establecerá una ruta de patrulla entre dicho punto y el punto B.

Conclusiones

Espero que esta entrada de introducción a Blueprint haya aclarado dudas o haya servido para haceros una idea del funcionamiento y de los objetivos de esta potente herramienta. En la siguiente entrega hablaré sobre casos de uso más concretos, ilustrando con ejemplos utilizados en el desarrollo de Aegis Down.

¡Hasta la próxima!

, , , , ,

Leave a Reply