5.1. HERRAMIENTAS EMPLEADAS
Unity 5.3: Motor de creación de videojuegos y principal herramienta para el desarrollo del proyecto. Posee una versión de licencia gratuita (siempre que no se sobrepase un elevado margen de beneficios con el producto desarrollado) y con posibilidad de crear juegos para multitud de plataformas. Permite trabajar con 3 lenguajes de programación (C#, JavaScript y Boo) de los cuales se ha escogido JavaScript para el proyecto. No se ha optado por la última versión del programa ya que ocasiona problemas con el despliegue automático en la nube.
MonoDevelop: Editor de código oficial de Unity. Es sencillo y permite integración directa con Unity. Solo hay que guardar los cambios en el editor para que Unity haga la compilación de los scripts afectados automáticamente. Se ha preferido en contra de editores más potentes (Visual Studio, Visual Code, etc) por su solvencia y sencillez de integración.
Notepad++: Editor de texto usado de forma auxiliar para ediciones de texto y código que no tuviesen que ser necesariamente integradas en Unity inmediatamente.
Unity Cloud Building: Servicio gratuito de Unity para compilar y generar los binarios de forma automática y almacenarlos en la nube. Solo precisa de algún tipo de repositorio online donde obtener el código.
Git: Software de control de versiones que permite tener repositorios locales y remotos. Se ha optado por él porque estaba familiarizado con su uso, además de por su potencia y versatilidad.
BitBucket: Servicio de alojamiento web de repositorio de código que permite trabajar con proyectos que usen Mercurial o Git como control de versión. Su uso es necesario para tener una copia de seguridad fuera de la máquina local así como para poder tener integración continua mediante Unity Cloud Building.
SourceTree: Cliente gratuito para la gestión de repositorios Git y Mercurial. Se ha usado para tener una interfaz gráfica que facilite los guardados (commits) de código y el envío al repositorio remoto de BitBucket.
MagicaVoxel[8]: Editor ligero gratuito basado en creación de modelos mediante voxels de 8 bits. Ha sido una herramienta perfecta para crear modelos “pixelados” de forma rápida y sencilla.
Trelio: Herramienta web de gestión de proyectos, con versión gratuita y de forma muy directa. Su facilidad permite implementar una metodología ágil, como puede ser Scrum, de forma más o menos acertada. Su principal baza es ofrecer una gestión y planificación de tareas simple, en contraposición a otras herramientas que requieren más dedicación y recursos, como Jira.
Google Drive: Herramientas de edición y almacenaje en la nube, usadas principalmente por su comodidad y portabilidad para mantener archivos y apuntes de documentación juntos.
Cacoo: Editor de diagramas y flujos online que permite almacenar las creaciones y compartirlas fácilmente. Se ha usado brevemente para crear los diagramas de este documento ya que estaba familiarizado con él.
5.2. DESARROLLANDO CON UNITY
Unity es un potente motor de desarrollo de videojuegos creado por Unity Technologies. Es una herramienta disponible en los tres principales sistemas operativos (Microsoft Windows, OS X y Linux) y cuenta con diferentes versiones disponibles. Una de ellas gratuita, Unity Personal, y el resto de pago; Unity Plus, Unity Pro y Unity Enterprise, cada una de ellas con funcionalidades extra. En el momento de la redacción de este documento, la última versión estable es la 5.4.
Su versatilidad permite generar el videojuego creado para múltiples plataformas. Esto unido a su rendimiento, facilidad de uso y gran comunidad de usuarios, le han llevado a ser uno de las principales frameworks de creación de videojuegos independientes e incluso grandes empresas han empezado a utilizarlo de forma recurrente para sus producciones. Algunos ejemplos de ello son Capcom, Square Enix, Ubisoft,etc.[19]
Mi creciente interés por esta plataforma y su proliferación en el mercado laboral actual, junto con su accesibilidad, me hicieron decantarme por ella casi sin consultar las otras alternativas. Su principal competidor directo, Unreal Engine, en su última versión (4.0) ha sido abierto al público masivo ofreciéndose como aplicación gratuita. A pesar de ello, su vertiente más enfocada al resultado profesional y su mayor dificultad para conseguir material de aprendizaje lo han descartado.
Otras alternativas podrían ser herramientas enfocados al desarrollo de videojuegos en el ámbito de las dos dimensiones como Cocos2D, las cuales han sido descartadas por intentar elaborar un videojuego más complejo.
Finalmente se ha optado por la versión 5.3.6f1 de Unity debido a algunos inconvenientes encontrados a lo largo del proyecto que han hecho cambiar de versión de Unity hasta en dos ocasiones. Más adelante se hará referencia a los motivos que propiciaron estos cambios.
5.3 METODOLOGÍA EMPLEADA
Debido a las características propias del desarrollo de un videojuego, el cual es mucho más iterativo y dinámico que un desarrollo de un aplicativo clásico, se ha optado descaradamente por emplear una metodología ágil. En concreto se ha usado una adaptación libre de Scrum[9]. Ésta popular metodología está basada en sprints de una duración concreta y corta (generalmente una o dos semanas) que intentan delimitar los objetivos más cercanos a conseguir. Para ello se desglosan los objetivos principales en tareas denominadas “épicas” que, a su vez, se desglosan en tareas más atómicas y con mayor facilidad para estimarlas temporalmente.
Debido a que la creación del videojuego ha sido llevado a cabo por un solo desarrollador, un servidor, se han eliminado elementos teóricos relativos a la metodología Scrum como pueden ser el Product Owner o el Scrum Master. Esto se ha hecho en beneficio de un desarrollo más rápido y coherente con el desarrollo de una sola persona. Cuando ha habido un contratiempo, este ha podido ser tratado con mayor inmediatez que si se hubiese usado una metodología clásica. Las pruebas han ido haciéndose a medida que se iban desarrollando partes y elementos del juego ya que el propio ciclo de un videojuego induce a ello. Por ejemplo, al implementar una característica de la interfaz o un elemento posicionado en el escenario, seguidamente se ha pasado a comprobar su validez ejecutando el propio juego y verificando que cumple con los requisitos esperados. A su vez, también se van generando pequeñas pruebas de integración dependiendo del alcance de los cambios.
Toda la gestión del código se ha efectuado mediante un repositorio Git almacenado en BitBucket. De esta forma había doble seguridad de integridad de los datos en caso de querer recuperar una versión anterior o (afortunadamente no ha pasado) pérdida de datos.
5.4 PLANIFICACIÓN INICIAL
Teniendo esta metodología en mente se desarrolló una planificación inicial al poco de empezar el proyecto que, como se podrá comprobar al final del documento, ha sufrido desviaciones importantes en algunos apartados.
La primera fase del proyecto está planificada para el aprendizaje del motor Unity, ya que mis conocimientos prácticos con el eran prácticamente nulos. También incluían las pruebas conceptuales para ser que sería capaz de conseguir con esta herramienta.
La segunda fase corresponde al diseño e implementación de los principales componentes del videojuego así como del primer nivel del videojuego.
La tercera fase engloba la creación de toda la parte gráfica y desarrollo del resto de componentes del juego. Pasar de los prototipos iniciales a incluir la carga gráfica que sería casi final.
La última fase se reserva para la finalización del resto de niveles, la incorporación de audio y el despliegue web.
La elección de una metodología de trabajo en el desarrollo de videojuegos depende de varios factores, como el tamaño del equipo, la complejidad del proyecto y las preferencias del equipo de desarrollo:
1. Desarrollo en Cascada:
- Descripción:
- Enfoque lineal y secuencial en el que cada fase del desarrollo (requisitos, diseño, implementación, prueba, mantenimiento) se completa antes de pasar a la siguiente.
- Aplicación:
- Proyectos donde los requisitos son claros y estables, y los cambios son mínimos durante el desarrollo.
2. Desarrollo Iterativo:
- Descripción:
- Divide el proyecto en iteraciones, cada una con un conjunto completo de fases de desarrollo. Cada iteración mejora y amplía la versión anterior del software.
- Aplicación:
- Proyectos que pueden beneficiarse de la adaptabilidad a cambios y mejoras incrementales.
3. Desarrollo Ágil:
- Descripción:
- Enfocado en la colaboración, adaptabilidad y entrega continua de software funcional. Métodos ágiles populares incluyen Scrum y Kanban.
- Aplicación:
- Proyectos con requisitos cambiantes, donde la entrega rápida de características es esencial.
4. Desarrollo en Espiral:
- Descripción:
- Combina aspectos de desarrollo en cascada con prototipos iterativos. Se enfoca en la identificación y mitigación temprana de riesgos.
- Aplicación:
- Proyectos grandes y complejos que requieren una gestión proactiva de riesgos.
5. Desarrollo Basado en Prototipos:
- Descripción:
- Se crea un prototipo rápido y simplificado del juego para evaluar y validar conceptos antes de la implementación completa.
- Aplicación:
- Proyectos donde la iteración rápida y la validación temprana de conceptos son críticas.
6. Desarrollo en V:
- Descripción:
- Similar al desarrollo en cascada, pero con un énfasis paralelo en pruebas. Cada fase de desarrollo tiene una fase de prueba correspondiente.
- Aplicación:
- Proyectos donde la calidad y la validación son prioridades fundamentales.
7. Modelo de Desarrollo en Equipo:
- Descripción:
- Los miembros del equipo trabajan simultáneamente en diferentes partes del juego y se integran al final. Similar al desarrollo iterativo pero con un enfoque más integrado.
- Aplicación:
- Equipos grandes donde diferentes componentes del juego pueden desarrollarse simultáneamente.
8. Extreme Programming (XP):
- Descripción:
- Metodología ágil que se centra en la entrega continua, la retroalimentación constante y la mejora continua.
- Aplicación:
- Proyectos pequeños a medianos donde la velocidad de entrega y la adaptabilidad son esenciales.
9. Scrum:
- Descripción:
- Marco de trabajo ágil que organiza el trabajo en sprints cortos y regulares, con roles definidos y reuniones específicas.
- Aplicación:
- Proyectos donde la flexibilidad y la entrega iterativa son prioritarias.