Ya pasó mucho tiempo desde la creación de los primeros videojuegos. Se ha pasado de los primeros que prácticamente se programaban en código máquina (instrucciones que prácticamente se basan en pedirle al procesador que realice sus funciones de almacenamiento, suma, pintado por pantalla frame a frame…) o incluso de las máquinas que se diseñaban con un juego en mente no modificable a tener sistemas intermedios, a los que llamamos motores, que hacen el trabajo sucio y nos dejan la parte importante a los desarrolladores: la creación y diseño del juego. Son sobradamente conocidos motores como Unreal Engine, Cryengine, Frostbyte, MT Framework…
En los últimos tiempos ha surgido el motor Unity 3D, destinado a pequeños desarrolladores pero con un gran trabajo por detrás. Como ellos mismos se definieron alguna vez, “el mejor motor de juego a este lado del millón de dólares”.
Principales características
Nada más coger Unity lo primero que tenemos es un editor altamente personalizable. Cada uno de sus módulos puede ser arrastrado y movido por la ventana (o, incluso, ser sacado fuera de ésta) para la comodidad del desarrollador. Una de las principales ventajas es que tiene un editor en el que ponemos nuestros objetos de juego, pulsamos al play y ya estamos jugando. Si el valor de alguna característica no nos convence, podemos modificarla en tiempo real. No sólo eso, sino que además sólo con el editor podríamos hacer cosas tan sencillas como situar un suelo en pantalla, una esfera, configurar unas cuantas propiedades, y ya tendríamos una pelota botando sin tener que haber escrito una línea de código.
Con esto quiero llegar a la posibilidad que tiene Unity de crearnos elementos prefabricados, los llamados prefabs, que serían objetos de juego ya preconfigurados para tener un comportamiento específico y ser utilizados múltiples veces, y modificando sólo el prefab todos los elementos asociados a él cambiarían automáticamente. Por poner un ejemplo, creamos un tipo de enemigo y configuramos sus valores de daño, velocidad, etc… Como cada enemigo lo usaremos múltiples veces, creamos un prefab y cada vez que queramos usar a ese enemigo cogemos nuestro prefab y lo metemos en nuestra escena donde queramos usarlo.
Luego está el sistema de componentes. A cada objeto de juego le asignamos un componente que no es más que una serie de características para nuestro objeto. Podemos añadir un componente de física, otro de sonido, algún efecto visual… y luego también podemos programarnos nuestros propios componentes con lenguajes como C#, JavaScript (bueno, es llamado Unity Script porque no es exactamente JavaScript aunque usa su sintaxis) o Boo, lenguajes para los que Unity nos da una gran cantidad de instrucciones para poder manejar los componentes propios de Unity e interaccionar entre ellos.
Además de todo esto, Unity trae por defecto una serie de prefabs y componentes destinados a tener juegos rápidos, como un personaje de FPS (ya configurado con su cámara y controles por defecto), otro de plataformas en 3D, efectos de cámara ya programados…
También tiene un sistema de mallas de navegación, muy útiles para manejo de personajes, que pueden ser generadas automáticamente a partir de nuestra escena, y es un sistema que funciona realmente bien.
Una de las características más importantes es un completo profiler (aunque sólo disponible en la versión de pago) que nos permite llevar control de la gestión de memoria y los objetos en escena, muy útil para detectar por ejemplo en qué se está gastando el tiempo de CPU para así optimizar fácilmente las partes de nuestro juego que nos hacen perder frames por segundo.
Otras posibilidades son las funciones de red, incluye algunas propias que simplifican enormemente la complejidad de sistemas de red con unas pocas instrucciones, además de tener la posibilidad de crear partidas en servidores externos o P2P, y en caso de querer hacer cosas más profundas de red siempre tenemos la posibilidad de utilizar nuestros propios métodos
En Unity 4 se añadió un nuevo modelo de animación, al que llamaron Mecanim, el cual acercó la animación de personajes a un sistema más acorde al usado habitualmente en videojuegos, que es el basado en estados de animación, pudiendo controlar las transiciones entre ellos. A continuación tenéis un vídeo de demostración:
Tecnologías externas
Unity tiene muy bien pensada su estructura, su editor y su motor gráfico. Como los videojuegos de hoy en día requieren de cada vez más sistemas, algunos de estos han sido “tomados prestados” de otras compañías. Concretamente, su sistema de físicas y su sistema de sonido.
Para las físicas se ha tomado el PhysX de Nvidia, aunque no tenemos acceso directo a él. Unity nos da una serie de funciones para hacer más sencillo su uso y, por debajo, el motor usado es el ya tan conocido en los videojuegos actuales. Lo mismo pasa con el sonido, que se ha optado por Fmod, otro bastante conocido y utilizado por muchos juegos actuales.
Además, Unity permite la programación de shaders, tanto usando DirectX como usando Open GL, y puede importar modelos y animaciones realizados en 3DMax o Maya.
Recientemente ha sido anunciada la creación de nuevas herramientas que facilitarán la creación de juegos 2D, dado que hasta ahora Unity estaba centrado en el 3D, y todos los juegos 2D se realizaban “trucando” el 3D con herramientas propias hechas por los desarrolladores. Aquí os dejo un vídeo del anuncio del nuevo sistema.
Ampliable
Unity permite la creación de nuevas herramientas para edición y desarrollo. Los programadores tienen a su disposición instrucciones para ampliar la interfaz de Unity y mejorar cada cosa que consideren “floja”. Aunque no se da la opción de acceder al código fuente de primeras, lo cierto es que las opciones son muy amplias. Se pueden crear plugins, dlls en C++, paquetes con nuevas opciones en la barra de menús… Por poner un ejemplo, una de las cosas que fallan en Unity es el sistema de interfaz (o GUI) para juegos, poco eficiente y algo caótico. Un usuario creó el sistema NGUI, que resuelve sus carencias y aporta más posibilidades, y lo puso a la venta en la Unity Asset Store, siendo un gran éxito. Ha tenido tanto éxito que su creador ha sido contratado por Unity, posiblemente para la creación de un sistema de GUI mejorado.
Y, como he comentado en el párrafo anterior, existe la Unity Asset Store, en la que se pueden comprar tanto estos plugins como grupos de modelos de personajes, sonidos, efectos visuales…y muchos de estos sistemas funcionan realmente bien.
Y por último está la comunidad, es fácil encontrar soporte en los foros oficiales de Unity o en otros foros externos. Por experiencia propia, si hay algún problema, no es complicado encontrar a alguien al que le ocurrió igual y encontró solución rápida.
Multiplataformidad
Es increíble la cantidad de formatos a los que exporta Unity. Al esperable Windows se suman Mac, Linux, iOS, Android, Blackberry 10, Windows Phone, navegadores web (con un plugin compatible con los principales navegadores), Flash (aunque el soporte fue abandonado recientemente), PS3, Xbox 360, Wii, WiiU, y han sido anunciadas versiones para PSVita, PS4 y Xbox One, las cuales seguramente ya andan en fases beta avanzadas y en manos de desarrolladores (incluso con juegos lanzados en el caso de Vita). Además de todo esto, Nintendo ofrece una licencia de Unity con su kit de desarrollo de WiiU.
Obviamente, cada versión tiene sus limitaciones (porque no es lo mismo un móvil que un PC, por ejemplo), pero es fácil evitar esos problemas y escalar a nuestras plataformas objetivo (teniendo en mente el objetivo, claro, mejor evitar el uso de shaders DirectX en plataformas Android).
No todo es perfecto…
Aunque el motor tiene muchísimas ventajas, también tiene algunos inconvenientes, aunque siempre depende de gustos, siempre habrá quien vea ventajas donde otros vean inconvenientes.
Como he mencionado antes, el sistema de GUI es poco eficiente y práctico, está limitado y para usarlo en plataformas móviles mejor prescindir de él, dado que el rendimiento se resiente mucho. Tiene buenas ideas como la posibilidad de uso de skins, pero en la práctica acaba saliendo mejor hacer un sistema propio. Se lleva un par de años anunciando que se iba a cambiar totalmente, añadiendo un sistema de animaciones asociado que permitiera hacer cosas más dinámicas, pero parece ser que lo siguen retrasando y el fichaje del creador de NGUI hace pensar que lo están rehaciendo desde cero.
Otro de los inconvenientes es la disponibilidad de múltiples lenguajes de programación. Aunque en realidad es positivo, el mezclarlos dentro de un mismo proyecto lleva a distintos problemas como órdenes de compilación o falta de comunicación entre componentes, salvo haciendo envío de mensajes que también están limitados en el número de parámetros. Como recomendación, una vez elegido un lenguaje, mejor ceñirse a él, aunque no suele ser del todo posible porque algunas cosas como los efectos predefinidos que trae Unity vienen algunos en JavaScript o C#.
También están las opciones de depuración. Para muchos programadores es costumbre utilizar breakpoints (puntos de ruptura o parada para ver el estado del código al llegar a ese punto) para depurar sus programas. Unity lo permite si se utiliza su propio compilador incluido, MonoDevelop, y funciona bastante bien, pero nos obliga a utilizar un entorno de desarrollo que no funciona tan bien como otros como Visual Studio para otros asuntos de programación, con lo que podemos optar por ir cambiando de compilador para distintas cosas (un proceso bastante incómodo) o acostumbrarnos a las limitaciones de cada uno. Eso sí, Unity trae instrucciones de log que ayudan mucho en tareas de depuración si se prefiere usar otros motores.
Por último, hay ciertos sistemas de los que incluye que serían un poco mejorables, aunque funcionan bien, pero algo limitados. Por poner ejemplos, aunque también hay algo de opinión personal, la reproducción de vídeos, el occlussion culling o el movimiento de los personajes por las mallas de navegación.
Precios
Unity dispone de una versión gratuita, que ya de por sí incluye Windows, Mac, Linux, Web Player, iOS, Android y Blackberry, aunque con limitaciones. Ciertos elementos como los efectos de cámara avanzados, el sistema de navegación, level of detail, algunas opciones de animación de Mecanim, occlusion culling, static batching o el profiler están ausentes de la versión gratuita. Actualizar a la versión Pro cuesta 1.500$, y luego las licencias pro para cada sistema móvil son 1.500$ adicionales a la licencia pro normal. Los precios de licencia en consolas no son públicos.
Recientemente se ha añadido un modelo de suscripción por el cual son 75$ al mes (con otros 75 adicionales para cada licencia Pro para móviles), con un mínimo de 12 meses, que hacen más sencillo el pago.
Aparte, se pueden contratar distintas opciones de soporte directo con Unity, aunque los precios ya se elevan bastante, a 500$ o 1.000$ al mes con un mínimo de tres meses.
Juegos que usan Unity 3D
Aquí os dejo una pequeña lista (el total es enorme) de algunos juegos bastante conocidos que usan Unity 3D y, al final de la lista, una demo técnica que se realizó con motivo del lanzamiento de Unity 4.
- Kerbal Space Program
- Deus Ex: The Fall
- Rain
- Max and the Magic Marker
- Scrolls
- Cities in Motion 2
- Bad Piggies
- Slender: The Arrival
- Dreamfall Chapters
- Thomas Was Alone
- Project Eternity
- Dead Trigger
- Shadowgun
- Stargate SG-1 Unleashed
- Battlestar Galáctica Online
- Wasteland 2
- Escape Plan
La entrada Unity 3D, el motor indie es 100% producto Deus Ex Machina.