Desarrollo de juegos con Unity

Vocación

Desarrollar juegos y en general programar es algo que tengo interiorizado desde muy pequeño cuando leía una y otra vez revistas como Micromanía, Hobbi consolas y similares.

¡¡Micromanía 225 pesetas!! recuerdo que eso suponía un esfuerzo en mi economía pero que no me dolía cuando era la fuente más increíble de información en Español sobre el mundo de los juegos. No hablaba mucho sobre programación pero en aquella época era algo bastante «culto» sobre el mundillo.

Después de las lecturas y cargado de ideas uno volvía a la realidad con su Spectrum y a pesar de todo el empeño que se le ponía, basic era… demasiado básico para poder hacer algo decente más allá de un juego de preguntas y respuestas sin gráficos de por medio. Por no hablar de lo difícil que por aquella época resultaba aprender algo, no como ahora con Google y YouTube.

La verdad es que no hice ningún juego o al menos no lo recuerdo, pero siempre me quedó esa espina clavada…. y yo me decía «¡por ideas no es!» pero había un escalón técnico importante.

Empezando

Hace algún tiempo que empecé a hacer mis pinitos en los juegos. Esto coincidió con que fui padre y cuando menos tiempo tenía, pero al final se encuentra hueco.

¿Como empecé? con una de los lenguaje que domino: jQuery, que al final no es más que un «manejador» super ágil del DOM pero de propósito general, para nada pensado específicamente para juegos. Aun así he desarrollado un par de juegos que ya están publicados y varios que me quedaron sin publicar. Ambos publicados son clones pero cada uno con su propia «alma». Están pensados para niños de 2 años en adelante pero sirve para cualquiera que quiera entrenar/calentar su mente. Son juegos tan simples como «buscar parejas» añadiendo varios pros, como poder jugar en Español o Inglés y con algunos niveles algo complejos.

 

El de animales llega casi a los 300 usuarios activos… algo que me enorgullece. La segunda hoy en día no tiene muchos usuarios, seguramente los animales tienen más «tirón» que los colores. Los juegos son gratis y para colmo no tienen publicidad.

Técnicamente no están mal aunque estén desarrollados únicamente con jQuery. Vistosos para los niños y además, se de buena tinta por amigos y por mis propios niños que gusta y entretiene.

Encaminarme a algo más profesional

Y cuando digo profesional no me refiero a vivir de ello, me refiero a usar una plataforma (llámese framework) destinado a hacer video juegos para «matar dos pájaros de un tiro», conocer una plataforma que me permita hacer casi de todo en el futuro y aprender algo nuevo (lenguaje o lo que sea).

Lo primero que se me ocurrió fue buscar frameworks basados en javascript y la verdad que hay muchísimos, tantos que uno acaba un poco perdido porque al final cada framework está especializado en una cosa concreta con lo cual es difícil decidirse.

Por algún motivo empecé por 3D, y es impresionante lo bien que los navegadores modernos mueven gráficos 3D con físicas complejas, librerías como three.js que usando el canvas pintan directamente usando la GPU, lo que les da mucha agilidad.

Aquí os dejo  la página de ejemplos de la propia three:

https://threejs.org/examples/#webgl_animation_cloth

Esta librería tiene sus propias físicas pero se queda corta en cuanto a componentes destinados a desarrollar un juego por ejemplo, es por ello que existen otras librerías como ammo, bullet, cannon, todas basadas en three.js pero centradas en la física y en los controles, todas son impresionantes.

Después de esta investigación, testeo y jugueteo con estas librerías me di cuenta de que quizás para empezar el 3D parecía un poco pretencioso por no hablar de que requiere muchísimo más trabajo hacer cualquier pequeño juego. Decidí que debía volver al 2D.

Profesional y en 2D

Vuelta a la carga de la investigación… cuando buscas estas keywords en google: framework, game, 2d. Uno se sorprende de la cantidad que hay… al final es difícil probarlas todas y empecé a leer reviews de gente que si lo había hecho y me decidí a probar pixi, un framework impresionante con mil ejemplos que mucha gente habla bien de el además con una comunidad muy amplia.

http://www.pixijs.com/

Estuve haciendo bastantes pruebas y me resultó muy fácil empezar a hacer las primeras cosas, un juego de burbujas… muy simple.

Según avanza uno se va dando cuenta de que faltan algunas cosas, o requieren de un trabajo extra. Haciendo memoria la falta más importante es un sistema de escenas, me explico. Casi todos los juegos tienen un menú principal, al pulsar en una de las opciones va al juego por ejemplo. Pues el menú sería una escena y el juego sería otra escena. En pixi hay que hacerlo manualmente ocultando y descubriendo objetos, sin embargo suena simple pero a la hora de hacerlo  no resulta cómodo tener que estar parando animaciones, sonidos, etc etc… Cae uno en la cuenta que al final pixi es un «renderizador» de gráficos, pensé que debía haber otra cosa.

http://phaser.io/

Las escenas también son «fases» del juego y así encontré Phaser otra librería basada en Pixi. Es una capa por encima de Pixi (ya que este al fin y al cabo solo «pinta» gráficos en pantalla) que añade principalmente el control de escenas (y otras muchas más cosas que no llegué a controlar).

¡Ahora si! me dije cuando podía hacer distintos scripts para cada sección de juego. LLegué a avanzar bastante y a tener una primerísima versión del juego de burbujas:

Llegado a este punto pensé que sería buena idea pasar el desarrollo al equipo de beta testing, es decir, mis hijos. Para ello lo mejor sería embutir el juego en una app android. Justo cuando pensé en esto tenía la mosca detrás de la oreja de que podría encontrarme con algunos problemas por que no sabía como se iba a comportar la librería dentro de una app. Pues efectivamente al compilar e instalar me di cuenta del grandísimo problema de phaser, al menos problema para mis intenciones:

Todo funcionaba a excepción de los sprites y esto tras investigar se debe a su sistema de cacheo de assets, deben ser urls para no chocar con ciertas políticas de seguridad de los navegadores, incluso cuando lo estamos ejecutando en local en una app. Al estar metido en un webview no encuentra las urls locales (y el sistema de cache no sabe enrutarlo)

Por más que investigué la única solución parecía ser usar algún framework de javascript para móviles, tipo phonegap. Parece ser que al instalarlo conjuntamente pueden servir a phaser las urls como un servidor local.

Pero eso si que no me gusta, «demasiadas capas» pienso yo, y demasiadas dependencias: javascript, navegador, pixi, phaser, phonegap, android e ios y finalmente play store y appstore. Dejé pasar un tiempo tras la frustración y decidí buscar algo totalmente distinto.

¿Plataforma profesional de desarrollo de video juegos? Unity

Un día recordé que mis colegas de Radical Graphics me comentaron hace tiempo que usaban Unity para desarrollar sus juegos. También uno tiene el logo en el subconsciente cuando empieza algún que otro juego. Es fácil encontrar ejemplos de juegos hecho con unity, pero lo más importante es: que sea potente con una comunidad amplia. Versátil, para poder hacer distintos tipos de desarrollo y si es grátis (al menos para comenzar) pues mejor que mejor.

Lo que más me sorprendió desde el primer momento es la cantidad de plugins y assets gratis que hay para comenzar, la propia plataforma ofrece mini juegos gratis de ejemplo para aprender de ellos.

Algo que no me gustó al principio es que parece estar muy destinado a la parte visual, pero esto es por mi carácter background… pronto me di cuenta que ¿»que es un juego si no es visual»? y no está nada mal este apartado, muy fácil de manejar.

En cuanto a la programación, en versiones anteriores se podía desarrollar con javascript, pero por algún motivo lo quitaron y ahora solo se puede desarrollar con C# (C Sharp), así que era otra ventaja más, aprender un nuevo lenguaje.

Curiosidad para el que no lo sepa C# viene de C «doblemente sumado». Empezó con el lenguaje C allá por 1969, posteriormente con la programación orientada a objetos y un poco más de alto nivel salió C++ que es como C=C+1 es decir sumarle uno, este vio la luz en 1979. Y ya por 1999 salió en escena C#, la almohadilla es como cuatro sumas puestas en un cuadrado, y sería como C++++, es decir C+2. La diferencia de este con el resto es brutal, siendo un leguaje de super alto nivel, muy fácil de aprender.

Actualmente tengo casi lista la primera versión de mi juego «simplón» de explotar burbujas. Se me ha ocurrido que voy a ir haciendo juegos adaptado a la edad de mis niños, ahora tienen 3 años así que lo de explotar cosas tocando en la pantalla les chifla, cuando sepan apuntar, lanzar, etc etc, habré aprendido a hacerlo.

¿Cómo es programar en Unity? a muy grandes rasgos, tienes una escena que puede ser 2D o 3D y una cámara, es esta escena puedes crear objetos llamados game objects, y a estos se les asignan unos componentes configurables que dependiendo de estos se comportarán de una forma u otra. Por ejemplo podemos poner un game object en una posición concreta de pantalla, asignarle un componente sprite renderer y configurarlo con una imagen de una pelota. Con esto se verá un pelota en pantalla inmóvil. Si le asignamos un componente rigid body tendrá un cuerpo y le afectarán las físicas, como por ejemplo la gravedad. Si le asignamos un componente collider, podrá detectar que se choca con otros colliders. Le podemos asignar un componente script y asignarle un archivo C#, este inicialmente (aunque no obligatoriamente) tiene dos métodos básicos que son Start() y Update(). En el gameobject Start se llamará la primera vez que el objeto está en escena y podremos retocar parámetros de los componentes del propio objeto o también de los demás de la escena. Update se llamará una vez cada frame. Y así se hace todo.

Como con todo… en youtube hay mil videos para aprender, un canal que me gusta especialmente es este: https://www.youtube.com/user/Brackeys

Tiene un potente sistema de partículas, un animador, sistema de esqueleto… y más que me quedará por descubrir. Algo también muy interesante es una tienda de objetos ya predefinidos que pueden subir los mismos usuarios, hay objetos y paquetes tanto de pago como gratuitos. Como es evidente los más famosos son los gratuitos y hay más de pago que gratis. De cualquier forma podemos importar cualquier imagen (sprite) que obtengamos de internet o que diseñemos nosotros. También objetos 3d. Unity tiene una especial conexión con modeladores 3D como por ejemplo Malla o el tan de moda blender. Pudiendo tener un objeto importado, hacer correcciones en blender y ver el resultado en unity ya integrado en la escena.

Blender que por cierto es una maravilla 100% gratuita y completísima: https://www.blender.org/

Cuando tenga terminado mi juego de Burbujas con Unity lo añadiré a este artículo.

Ya está listo hace un tiempo, aquí puedes instalarlo en un móvil Android: http://bit.ly/2EXzDH9

Tiene esta pinta:

Conclusión

Si quieres iniciarte en el mundo de desarrollo de video juegos… no es fácil, pero es mucho menos difícil de lo que cabría imaginar, sobre todo si sabes programar. Pero incluso si no sabes programar Unity no es mala opción puesto que tiene una grandísima parte visual que solo hay que saber tocar parámetros y en cuanto a la parte de programación, C Sharp es facilísimo de aprender.

¡Anímate!