lunes, 11 de septiembre de 2017

Unreal Engine 4. Programando con Blueprints.

Cuando hicimos la migración de Unity 5 a Unreal Engine 4, una de las novedades más importantes de este cambio era la posibilidad de programar el juego con Blueprints.

¿Qué son los Blueprints? básicamente una manera de programar con nodos y enlaces sin picar una linea de código. Esto tiene cosas buenas y cosas malas, aunque si seguimos programando el juego con Blueprints es que de momento nos están gustando :-).

Ejemplo de Blueprint para el movimiento del coche.


En teoría se puede programar todo un juego con Blueprints, y esa es nuestra idea para el juego The Deliver, ya que creemos que no es lo suficientemente complejo como para que no sea así. Otro ejemplo de juego que está en parte, o totalmente (no estamos seguros), programado con Blueprints es el conocido PlayerUnknown's Battlegrounds, donde en un vídeo de desarrollo mostraron como estaban programando la personalización de la ropa de los jugadores y se pudo ver una parte de programación con este sistema.

Seguramente el sistema de programación con Blueprints podría dar para muchas entradas de blog, pero el objetivo de esta entrada es para dar a conocer este método de programación introducido en la versión 4 de Unreal Engine y que muchos quizá no conocen si vienen de Unity 5 u otros motores de juego. Aunque sabemos que para Unity existe un asset para programación visual siempre decimos que si ya viene integrado con el motor, mucho mejor.

Primero vamos a comentar las cosas que nos gustan de este método para programar:
  • Es muy visual. Una de las principales ventajas por la que se fomenta la programación con Blueprints es porque es muy gráfico y por lo tanto, más fácil de entender y aprender. Y es más ventaja aún cuando tienes que explicar ese trozo de código a otra persona que no está familiarizada con la programación tradicional en texto.
  • Es divertido. Un lenguaje para sentirte motivado para programarlo tiene que ser divertido. Si no es divertido no te lo tomas con tantas ganas. Y la programación visual con Blueprints, de momento, nos parece divertida. A parte, la interfaz de los nodos y los enlaces está muy cuidada, por lo que se hace agradable a la vista trabajar con ellos.
  • Evita problemas básicos de compilación. ¿No os ha pasado nunca que una parte del código te daba un error de compilación y no encontrabas el problema y resulta que al final era por no poner un punto y coma al final de linea? pues a nosotros muchas veces, hasta ahora :). Con la programación con Blueprints, como todo va por nodos y enlaces no hay sintaxis, por decirlo de alguna manera, y es todo más estricto con los tipos de datos, y si la entrada de un nodo tiene que ser de un tipo en concreto no te dejará conectar el enlace a menos que sea de ese tipo. O en todo caso te hará automáticamente la conversión para que los tipos coincidan. Por ejemplo, intentar conectar una salida integer con una entrada string, automáticamente te hace el cast a string.
En este caso nos indica que los tipos no son compatibles y debemos hacer un cast.
  • Trabajando dentro del contexto. Trabajando de este modo el propio editor te limita al contexto en el que estás trabajando, es decir, cuando en la salida de un nodo quieres crear un nuevo nodo enlazado al primero, el editor solo te muestra las opciones disponibles de enlace, por lo que hay poco margen de error a ligar algo que no toca. Y si en las opciones de enlace no sale la opción que estás buscando, es que el nodo o enlace orígen no está correctamente creado.
Popup que se muestra al querer enlazar la salida del nodo.
  • Variables, funciones, bucles, etc. La programación con Blueprints es como cualquier otro lenguaje de programación, ya que durante la compilación el editor transforma los Blueprints a código C++ nativo, por lo que soporta la creación de variables, funciones, bucles, condicionales, etc.
  • Proyectos con Blueprints y código C++. Una de las cosas buenas de crear un proyecto en Unreal Engine es que no tienes que escoger un sistema u otro de programación. Sino que puedes tener parte de tu proyecto hecho en Blueprints y otras partes programadas con C++ y todo debería funcionar correctamente, ya que no se obliga a hacerlo de una manera u otra.
  • Cambio de versiones menos traumático. Una de las cosas que vimos en los inicios de la migración a Unreal Engine, es que con proyectos hechos solo con C++, el cambio de versiones del editor (por ejemplo de la 4.15 a la 4.16) era más delicado que si tenías todo el proyecto hecho con Blueprints, dónde la conversión entre versiones es directa y no tienes que hacer nada especial. En cambio con código propio de C++ algunas conversiones nos daba algún error de compilación que debía ser tratado para soportar la nueva versión.
  • Documentación en Blueprints. A destacar también que la gente se ha acostumbrado a utilizar los Blueprints, así que mucha documentación que encuentras en Internet y muchas dudas de usuarios son con ejemplos gráficos de Blueprints, por lo que no suele ser complicado encontrar un caso parecido al tuyo cuando te da algún error o quieres hacer algo en concreto.
Y ahora vamos con las cosas no tan buenas o mejorables a nuestro criterio:
  • No es tan eficaz como programar con C++. Si quieres realizar funciones de cálculos complejos o que requieran un alto nivel de rendimiento, seguramente los Blueprints no son la mejor opción y tengas que hacerlo con C++ directamente.
  • Programación horizontal. Acostumbrados a la programación tradicional dónde las líneas de código van una debajo de la otra y la lectura se hace en vertical para una mejor comodidad, nos hemos encontrado que la programación en Blueprints invita a hacerlo en horizontal por propia naturaleza de los nodos, dónde tienen las entradas a la izquierda y las salidas a la derecha. Por lo que al final, para una mejor organización visual, terminas programando en horizontal y a veces no termina de ser del todo cómodo.
La conexión de nodos y enlaces invita a programar en horizontal.
  • Organización del código. Aunque el propio editor tiene herramientas para organizar el código como añadir comentarios para encapsular un grupo de nodos, es verdad que cuando empiezas a tener bastantes nodos y enlaces en pantalla, a veces puede llegar a ser un poco caos sino te organizas bien y eso, a veces, no es fácil hacerlo. En la siguiente imagen, por ejemplo, se puede ver nuestra organización actual del código para las funcionalidades principales del juego. Visualmente queda bien. Los problemas vienen cuando tienes que añadir cosas entre medio y tienes que empezar a desplazar partes de código para hacer hueco.
Organización del código en el nivel persistente.
  • Desplazamiento automático del código. En la programación tradicional, cuando quieres añadir una línea de código en medio de una función o dentro de un bucle, simplemente te pones al inicio de la línea donde quieres añadir el código, presionas Enter y todo el código se desplaza hacia abajo para poder añadir la línea dónde querías. Con Blueprints la cosa no es tan directa, ya que no hay desplazamiento automático de los nodos si quieres añadir uno en medio de otros, por lo que primero tienes que seleccionar todos los nodos que se desplazarían, moverlos manualmente, y luego añadir el nuevo nodo.
Finalmente vamos a mostraros un pequeño vídeo para ver un poco como es la dinámica de programación con Blueprints. Aunque si queréis ver más, os aconsejamos que hagáis una búsqueda en Youtube dónde está lleno de vídeos de este estilo y os podréis hacer una mejor idea.

En el vídeo simplemente se replica el código de la función Load Mission que hay justo arriba, pero os puede ser útil para ver como se crean nodos, como se enlazan, como se organiza una vez creado, etc.


Esperamos que os haya sido útil y nos vemos el próximo lunes :-).

6 comentarios:

  1. Hola, acabo de llegar a este blog y enseguida me ha llamado la atención esta entrada. Conozco este tipo de programación pero en una indústria completamente distinta. He trabajado en entornos de Call Centers y CTI para grandes organizaciones, muchos fabricantes ofrecen distintos entornos de programación para enrutar llamadas desde que entran en la centralita o centralistas de la empresa hasta el agente que la va a atender. Aunque a veces no sea evidente, los flujos pueden ser bastante complejos dependiendo de quien llame, para qué, desde donde y el histórico que ha tenido esa persona. A menudo hay que cruzar muchas bases de datos y tomar decisiones para llevar esa llamada a la persona más adecuada en el menor tiempo posible. Desde hace años los fabricantes suelen ofrecer precisamente entornos para crear esos scripts de enrutamiento con "blueprints" como aquí los llamais aunque orientados a otro mercado como el de las comunicaciones de voz y multimedia. Como bien decís, tiene sus cosas buenas y otras malas o muy malas, podría extenderme pero creo que habéis hecho un buen resumen y coincide bastante con mis experiencias con este tipo de entornos.

    ResponderEliminar
    Respuestas
    1. Hola Chris, gracias por participar!

      Desde luego este tema de los Blueprints es muy interesante y para nosotros totalmente novedoso. Aunque en Blender (para modelado 3D, animación, etc.) también se utiliza un método parecido de conexión de nodos, para programación de juegos es la primera vez que utilizamos un método así y nos está gustando bastante, ya que hasta ahora solo habíamos utilizado el C# y JavaScript en Unity.

      Aun y así, seguro que alguna ventaja o desventaja de utilizar Blueprints me habré dejado. Si te acuerdas de algunas en concreto de tu entorno las puedes comentar, seguramente se puedan aplicar a nuestro caso y la pueda añadir a la entrada del blog :-)

      Eliminar
  2. Amigo, en que situación tendrías que utilizar C++ en vez de BP ?...
    Y lo otro, si ya sabes C#, entonces C++ no se te haría tan complejo, visualmente se parecen mucho.

    ResponderEliminar
    Respuestas
    1. Para sacarle el mejor rendimiento siempre recomiendan utilizar C++, o cuando necesitas hacer calculos donde el tiempo de procesamiento sea importante.

      Personalmente he programado tanto en C++ como en C#, pero en este caso quisimos probar los Blueprints para ver que tal era trabajar con ellos, y quedamos bastante contentos.

      Eliminar
  3. Entiendo, bueno yo he probado BP, pero siempre me gusta programar, es que siento que si no programo pierdo el ritmo, pero muy bien que hayas tenido buena experiencia con ellos, a mi es que no me da ver un espagueti de nodos jaja, o quizá no le he sacado mucho provecho aún....

    Respecto a Unity, tienes dudas si volverás o ya definitivamente te quedas con Unreal ?
    saludos.

    ResponderEliminar
    Respuestas
    1. Ahora mismo tenemos un poco de lado tanto Unity como Unreal Engine, mas que nada por tema del trabajo que se come la parte esta de hobbie. Pero si hay que tocar alguno, será el Unreal Engine.

      Eliminar