View
10
Download
0
Category
Preview:
Citation preview
Escu
ela
Polit
écn
ica S
up
eri
or
de J
aé
n
UNIVERSIDAD DE JAÉN
Escuela Politécnica Superior
Trabajo Fin de Grado
DESARROLLO DE UN
VIDEOJUEGO
Alumno: Oscar Ortiz Cuevas
Tutor: Prof. D. Juan Roberto Jiménez Pérez Dpto: Departamento de Informática
Septiembre, 2016
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 2
Tabla de contenido
1. INTRODUCCIÓN ......................................................................................... 6
1.1. Motivación ............................................................................................. 7
1.2. Objetivos ............................................................................................... 8
1.3. Contenidos de la memoria .................................................................... 9
2. TECNOLOGÍAS USADAS. STATE OF THE ART .................................... 10
2.1. Motor de videojuegos: Unity ................................................................ 10
2.2. Lenguaje de programación: C-Sharp (C#) .......................................... 12
2.3. Herramienta de planificación: Pivotal Tracker ..................................... 13
2.3.1. Pantalla principal .......................................................................... 14
2.3.2. Historias de usuario ...................................................................... 15
2.4. Herramienta de diseño: Visual Paradigm ............................................ 16
3. PLANIFICACIÓN ....................................................................................... 17
3.1. ¿Qué es Scrum? ................................................................................. 17
3.2. Roles en Scrum ................................................................................... 18
3.3. Fases de la metodología ..................................................................... 19
3.4. Adaptación de Scrum a este proyecto................................................. 20
3.5. Resumen de las iteraciones ................................................................ 20
3.6. Gráfico de iteraciones ......................................................................... 25
3.7. Prototipos ............................................................................................ 26
4. PRESUPUESTO ........................................................................................ 28
4.1. Recursos humanos ............................................................................. 28
4.2. Recursos materiales ............................................................................ 28
4.3. Presupuesto total ................................................................................ 29
5. ANÁLISIS INICIAL ..................................................................................... 30
5.1. Tipo de juego (High Concept Document / Game Treatment Document)
30
5.2. Resumen de la historia ........................................................................ 31
5.3. Características del personaje (Character Design Document) ............. 31
5.3.1. Estadísticas del personaje ............................................................ 31
5.3.2. Habilidades ................................................................................... 32
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 3
5.4. Equipo ................................................................................................. 33
5.4.1. Armas ........................................................................................... 33
5.4.2. Revestimiento para el arma .......................................................... 34
5.4.3. Armaduras .................................................................................... 34
5.4.4. Escudos ........................................................................................ 36
5.4.1. Emblemas ..................................................................................... 36
5.5. Objetos ................................................................................................ 38
5.5.1. Objetos consumibles .................................................................... 38
5.5.2. Objetos no consumibles (coleccionables o materiales) ................ 39
5.6. Escenarios (World Design Document) ................................................ 40
5.6.1. Aldea ............................................................................................ 40
5.6.2. Mapas ........................................................................................... 43
5.7. Misiones .............................................................................................. 44
5.7.1. Misiones de entrega de materiales ............................................... 44
5.7.2. Misiones de combate .................................................................... 44
5.8. Enemigos ............................................................................................ 45
5.9. Interfaz de usuario (User Interface Design Document) ....................... 47
5.9.1. Menú principal .............................................................................. 47
5.9.2. Interfaz durante una misión .......................................................... 48
5.9.3. Menú de pausa ............................................................................. 49
5.9.4. Pantalla de recompensa ............................................................... 50
5.9.5. Pantalla de carga .......................................................................... 50
5.9.6. Sistema de notificaciones ............................................................. 51
5.9.7. Efectos visuales ............................................................................ 51
5.9.8. Efectos sonoros ............................................................................ 52
5.10. Situaciones de juego (Flowboard) ....................................................... 53
5.11. Evolución del juego (Story and Level Progression Document) ............ 55
6. DISEÑO E IMPLEMENTACIÓN ................................................................ 56
6.1. Sistema de objetos .............................................................................. 57
6.1.1. Clase Item .................................................................................... 57
6.1.2. Clase ItemEffect ........................................................................... 58
6.1.3. Clase ItemDatabase ..................................................................... 59
6.2. Gestión del personaje ......................................................................... 60
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 4
6.2.1. Clase Player ................................................................................. 60
6.2.2. Clase IG_Player ............................................................................ 62
6.2.3. Controlador del personaje (PlayerController) ............................... 63
6.2.4. Personalización del personaje (CharacterCustomization) ............ 64
6.3. Sistema de habilidades ....................................................................... 65
6.4. Inventario y Mochila ............................................................................ 66
6.4.1. Clase Inventory ............................................................................. 66
6.4.2. Clase Bag ..................................................................................... 68
6.5. Equipamiento ...................................................................................... 69
6.5.1. Armas (Weapon) ........................................................................... 69
6.5.2. Revestimiento del arma (WeaponCoat) ........................................ 70
6.5.3. Armaduras (Armor) ....................................................................... 70
6.5.4. Escudos (Shield) ........................................................................... 71
6.5.5. Emblemas (Emblem) .................................................................... 71
6.6. Sistema de misiones ........................................................................... 72
6.6.1. Clases Quest (y subclases) y QuestCollection ............................. 72
6.6.2. Clase QuestLog ............................................................................ 74
6.6.3. Recompensa de misión (Reward) ................................................. 75
6.6.4. Controladores de misión ............................................................... 76
6.7. Enemigos ............................................................................................ 77
6.7.1. Enemy y EnemyCollection ............................................................ 78
6.7.2. EnemyInGame .............................................................................. 79
6.7.3. EnemyMovement .......................................................................... 80
6.7.4. EnemyReward .............................................................................. 81
6.8. Mercancía en la tienda y la forja (ShopAvailableStock y
ForgeAvailableStock) .................................................................................... 81
6.8.1. ShopAvailableStock ...................................................................... 81
6.8.2. ForgeAvailableStock ..................................................................... 83
6.9. Elementos de interfaz .......................................................................... 85
6.9.1. Menú principal .............................................................................. 85
6.9.2. Pantalla de carga .......................................................................... 86
6.9.3. Notificaciones ............................................................................... 87
6.9.4. Cuadros de diálogo ....................................................................... 88
6.10. Controlador de audio (SoundManager) ............................................... 89
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 5
6.11. Guardado y carga de datos ................................................................. 90
7. RECURSOS UTILIZADOS ........................................................................ 93
8. CONCLUSIONES ...................................................................................... 94
8.1. Conocimientos aplicados .................................................................... 94
8.2. Dificultades encontradas ..................................................................... 94
8.3. Resultados obtenidos .......................................................................... 95
9. TRABAJO FUTURO .................................................................................. 96
10. BIBLIOGRAFÍA ....................................................................................... 97
11. Anexo: Manual de usuario ...................................................................... 98
11.1. Menú principal ..................................................................................... 98
11.2. Pantalla de juego ................................................................................ 98
11.3. Controles ............................................................................................. 99
11.4. Consejos para la aventura .................................................................. 99
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 6
1. INTRODUCCIÓN
Durante estos últimos años, las tecnologías han experimentado un auge
tanto en su desarrollo como en su uso. Dentro de las Tecnologías de la
Información, una de las ramas que más han notado este cambio ha sido el
Desarrollo de Videojuegos.
La industria del videojuego ha evolucionado durante este tiempo, desde
que eran algo poco conocido en la sociedad, hasta ahora, que es una de las
principales formas de entretenimiento. Además cabe destacar el auge de las
competiciones profesionales de videojuegos, conocidas como E-Sports,
seguidas mundialmente por millones de personas.
Esta evolución en los videojuegos podemos apreciarla en muchos
aspectos: mejor calidad de imagen, pasando de una imagen en blanco y negro
a una en HD; o la interacción entre jugadores, siendo en los inicios inexistente,
mientras ahora pueden verse multitud de jugadores participando en la misma
partida a través de la red. En definitiva, ha pasado de ser un simple pasatiempo
a ser una forma de arte, al mismo nivel que la música o el cine.
Este progreso en la Industria del Videojuego se puede explicar desde
varios puntos de vista. Uno de ellos es sin duda el gran aumento en el uso de
los ordenadores e Internet, así como la espectacular evolución en la potencia
tanto hardware como software, permitiendo a todo el mundo consumir y
producir contenidos de todo tipo.
Otro aspecto fundamental en este tema es la gran cantidad de
información disponible, pudiendo encontrar contenido de cualquier cosa
imaginable, así como herramientas de diseño, modelado, programación o
edición de imagen y sonido, entre otros. Además, muchas de ellas son
gratuitas, lo que incita a su uso.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 7
1.1. Motivación
Durante gran parte de mi vida he estado en contacto con el mundo de
los videojuegos, tanto jugándolos como siguiendo los medios especializados.
Por ello, estaba interesado en embarcarme en un proyecto relacionado con
este mundo.
El objetivo propuesto en este proyecto es la realización de un prototipo
de un videojuego, empezando desde cero, y tocando todas las partes del
desarrollo (programación, diseño de escenarios, inteligencia artificial,
animación, sonido, etc.).
A priori, la dificultad reside en reunir el trabajo de muchas de las
materias impartidas en el Grado de manera conjunta, es decir, aspectos como
la planificación, el diseño de clases, la implementación, la creación de modelos
y animaciones y más.
En la fase de planificación, he pensado usar la metodología Scrum, vista
en Desarrollo Ágil, ya que nos permite ir desarrollando nuestro producto, en
nuestro caso un juego, por iteraciones o etapas. Esto nos viene bien, ya que en
principio tenemos varias partes más o menos diferenciadas que podemos
desarrollar por separado, para posteriormente unirlas. En esta metodología
debemos priorizar y evaluar el coste de las tareas, y desarrollarlas en sprints de
corta duración.
En la fase de diseño e implementación he utilizado todo lo visto sobre
Programación Orientada a Objetos, como el uso de clases, herencia, uso de
patrones, polimorfismos, etc.
También he querido plasmar los conocimientos adquiridos en la
asignatura de Interacción Persona-Ordenador, para diseñar una interfaz de
usuario intuitiva y fácil de utilizar.
Para acabar, decir que he aplicado conocimientos aprendidos en Gestión de
Proyectos Software, Inteligencia Artificial, Desarrollo de Videojuegos,
Estructuras de Datos e Ingeniería de Requisitos, entre otras.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 8
1.2. Objetivos
El objetivo de este trabajo es desarrollar un videojuego desde cero. Se
pretende construir un prototipo de juego de rol y acción en tercera persona,
intentando mezclar aspectos de ambos estilos. Por un lado cogemos
características de los juegos de rol (RPG), como un sistema de
creación/mejora/compra de objetos y equipamiento, un sistema de juego
basado en misiones o la evolución del personaje a lo largo del juego. Por otra
parte añadimos aspectos de los juegos de acción, como el sistema de lucha en
tiempo real.
La plataforma sería PC, en concreto para Windows, aunque una de las
ventajas que tiene Unity es la facilidad para portar nuestro videojuego a
múltiples plataformas, incluso móviles o consolas.
Para ello, habrá que realizar un diseño, para posteriormente pasar al
modelado y animación. Todo ello mediante el motor de juegos Unity,
ayudándonos de alguna herramienta para la planificación y diseño.
No obstante, antes de empezar tenemos el inconveniente de tener poca
experiencia en proyectos como el que nos disponemos a realizar, ya que hasta
ahora nos limitábamos a hacer prácticas en las que se nos pedían tareas más
concretas. En este caso, debemos tener en cuenta todos los aspectos de un
proyecto más profesional, como la planificación, el diseño o las pruebas, al
mismo tiempo.
Por ello, se requiere un periodo inicial de adaptación a este formato de
trabajo, afectando de cierta forma a la planificación, que se verá más adelante.
En resumen, este Trabajo Fin de Grado será mi primera experiencia en
cuanto a proyectos más complejos, más parecido a un proyecto profesional.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 9
1.3. Contenidos de la memoria
Los contenidos expuestos en la memoria se dividen en apartados, según
el aspecto del desarrollo al que hacen referencia.
En el apartado 2 se exponen las tecnologías usadas, es decir, las
herramientas y técnicas utilizadas. Aquí entran tanto el motor de videojuegos
usado como el lenguaje de programación, y más.
En el apartado 3 se explica todo lo referente a la planificación, tanto de
la técnica usada como de la herramienta software elegida, así como un
resumen de las iteraciones y de los prototipos obtenidos.
El apartado 4 está dedicado al cálculo del presupuesto, tanto humano
como material.
El apartado 5 es muy importante, ya que en él se exponen todos los
elementos que forman parte del videojuego, desde el punto de vista del
análisis, definiendo la relación entre estas partes y el jugador.
En el apartado 6 se explica toda la parte de diseño e implementación de
lo obtenido en la etapa anterior, esto es, la estructura de clases y relaciones.
El apartado 7 está dedicado a exponer un listado con los recursos
utilizados, los cuales son de terceros.
El apartado 8 es donde se resumen mis impresiones al finalizar este
proyecto, así como una valoración de las dificultades encontradas durante el
desarrollo.
En el apartado 9 se definen las trazas para el desarrollo futuro del
proyecto, ya sean nuevas funcionalidades o mejoras de las ya existentes.
El apartado 10 está dedicado a la bibliografía, tanto de recursos escritos
como sitios web.
Por último, en el anexo viene incluido un manual de usuario, hecho
desde el punto de vista de los que se incluyen en los videojuegos comerciales.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 10
2. TECNOLOGÍAS USADAS. STATE OF THE ART
Las tecnologías usadas en este proyecto son Unity como motor gráfico y
C-Sharp(C#) como lenguaje de programación. Para la parte de planificación
usaré la herramienta Pivotal Tracker, ya que se adapta bien a la metodología
Scrum. Por último, para la realización de diagramas de diseño optaré por Visual
Paradigm, utilizado a lo largo del Grado, siendo una de las herramientas más
potentes para este apartado.
2.1. Motor de videojuegos: Unity
A la hora de escoger un motor gráfico para nuestro proyecto, tenemos
varias alternativas interesantes, como el propio Unity, Unreal Engine,
CryEngine o Source2. [1]
- Unity (última versión Unity 5): Actualmente Unity es el motor gráfico más
usado, debido principalmente a que sus últimas versiones permiten
realizar productos compatibles con la mayoría de plataformas,
incluyendo consolas, móviles, versiones web y distintos sistemas
operativos.
Una de las claves del éxito de este motor gráfico es su modelo de
negocio. Existen dos versiones diferenciadas: la gratuita (versión
Personal), que ofrece gran variedad de opciones a la hora de desarrollar
productos; y la de pago (versión Profesional), que ofrece más
funcionalidades y facilidades para trabajar en proyectos multiplataforma.
Con la versión Personal podemos obtener beneficios con nuestros
primeros proyectos sin tener que pagar nada (hasta un límite de
100.000$ anuales, tras esto habría que adquirir la versión de pago), lo
que anima a pequeños desarrolladores a usarlo y obtener sus primeros
ingresos.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 11
- Unreal Engine (últ. versión Unreal Engine 4): Este motor desarrollado
por Epic Games destaca por su gran calidad gráfica, incluyendo
iluminación dinámica y sistemas de partículas más potentes que en
Unity.
Al igual que Unity, Unreal Engine 4 es totalmente gratuito en la
actualidad, aunque tendrás que pagar un 5% en royalties si ganas más
de 3.000$ por trimestre y juego. También tiene en común con el anterior
la relativa facilidad para los nuevos desarrolladores.
- CryEngine: CryEngine es un motor gráfico extremadamente potente,
desarrollado por Crytek. El motor está diseñado para usarse en juegos
de PC y consolas, incluyendo PlayStation 4 y Xbox One. Las
capacidades y potencia de este motor sobrepasan de largo a motores
como Unity, tan solo Unreal Engine 4 puede competir en aspectos como
las físicas, los sistemas de animación de modelos y la capacidad de
iluminar en tiempo real las escenas. Sin embargo, a diferencia de los
anteriores, este motor no es gratuito, aunque tiene un precio asumible
de 9.90$ al mes.
Uno de los inconvenientes de CryEngine es su gran curva de
aprendizaje, por lo que quizá sea mejor escoger Unity o Unreal Engine si
no tenemos entre manos un proyecto de gran calibre.
Source2: Este motor ha sido usado en varios títulos de la empresa
Valve, siendo de los más jugados en la plataforma Steam.
Al final, decidí escoger Unity como plataforma para mi Trabajo por varias
razones: es gratuito, existe gran cantidad de información (manuales web,
tutoriales, ejemplos, etc.), la interfaz me resultó muy cómoda desde el primer
momento, y el hecho de haberlo utilizado antes en alguna asignatura del
Grado.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 12
2.2. Lenguaje de programación: C-Sharp (C#)
A pesar de que Unity tiene una estructura muy visual, es necesario el
uso de scripts, y para ello tenemos tres opciones a la hora de escoger un
lenguaje de programación [2]:
JavaScript: Anteriormente conocido como UnityScript, es un lenguaje
soportado por la mayoría de sistemas, y perfecto en el desarrollo web.
C-Sharp o C#: Lenguaje orientado a objetos bajo la firma de Microsoft,
forma parte de la plataforma .NET.
Boo: Lenguaje inspirado en la sintaxis de Python. Es la opción menos
usada de entre estas tres.
A la hora de escoger el lenguaje adecuado para mí, he escogido C# por
varias razones: es similar a C++, lenguaje orientado a objetos que hemos
utilizado durante todo el Grado, no teniendo que empezar a aprender la sintaxis
desde cero. Además, es el lenguaje más utilizado por los usuarios de Unity, y
por lo tanto la mayoría de información disponible usa C#.
Por otro lado, he dejado de lado JavaScript por varios motivos: la
sintaxis no me pareció tan sencilla como la de C#, debido seguramente a que
no lo he usado tanto. Por otro lado, la mayoría de información existente no
utiliza este lenguaje, incluso la proporcionada por Unity, por lo que se me haría
difícil convertir todo lo consultado a JavaScript.
Por último, Boo fue descartado de inmediato, ya que usa sintaxis de
Python, lenguaje que nunca he usado. También influye que Boo sea el lenguaje
menos usado y el menos recomendado a la hora de empezar a trabajar con
Unity.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 13
2.3. Herramienta de planificación: Pivotal Tracker
Como he indicado anteriormente, he decidido utilizar un desarrollo
siguiendo la metodología Scrum (Ver apdo. 3). Las características de esta
metodología se resumen en la división del proyecto en iteraciones o sprints,
cada una con sus tareas correspondientes. Otros aspectos de esta
metodología son la estimación de coste (se mide tiempo o recursos) y la
prioridad (en puntos, siguiendo un baremo concreto), decidiéndose antes de
empezar la iteración y sin poder variarse una vez empecemos el sprint. Se
detallará más esta metodología en el apartado dedicado a la planificación.
Sabiendo esto, podemos elegir entre dos opciones a la hora de planificar
las tareas. O bien hacerlo a mano, calculando costes, tiempo y progreso de las
iteraciones manualmente; o bien utilizar una de las muchas herramientas
software disponibles para nuestro propósito. Me decanté por lo segundo, ya
que en la asignatura de Desarrollo Ágil pudimos ver todas las ventajas de estas
herramientas, en concreto las que encontramos en la web. Algunos ejemplos
son Kunagi, ScrumDo, IceScrum, Pango Scrum o la que usaremos en nuestro
caso, Pivotal Tracker.
Pivotal Tracker [4] es una herramienta de planificación web gratuita,
centrada en el uso de la pila de producto y medidas como la velocidad. Además
tenemos a nuestra disposición un historial, donde se reflejan todos los cambios
que hagamos en el proyecto, en caso de que queramos revertir una
modificación o simplemente controlar los cambios.
Esta herramienta también ofrece funciones muy interesantes para
proyectos en grupo, como el uso de perfiles, que controlan los privilegios de
cada miembro del grupo a la hora de crear, consultar o modificar tareas. En
nuestro caso no las necesitamos, pero nunca viene mal saber estas ventajas si
en el futuro trabajamos con más personas.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 14
2.3.1. Pantalla principal
Una vez entramos en la web (www.pivotaltracker.com) y creamos un
proyecto nuevo, nos aparecerá la pantalla principal.
Como vemos, nos aparecen las pestañas Current, Backlog y Icebox.
Current: Aquí aparecerán las tareas que forman la iteración actual.
Backlog: En esta pestaña tendremos todas las tareas de las siguientes
iteraciones, a las que ya les hemos asignado su coste.
Icebox: Aquí tenemos las tareas que todavía no hemos acabado de
estimar, y que por lo tanto no entran aún en la planificación.
Aparte de estas, tenemos la pestaña Done, en la que tenemos las tareas
acabadas.
Ilustración 1: Pantalla principal de Pivotal Tracker
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 15
2.3.2. Historias de usuario
Al crear una historia de usuario tendremos algo como esto.
La primera opción que vemos es el
Story Type, donde podemos elegir entre
Feature (requisito), Bug (arreglo de fallos),
Chore (aspectos externos al proyecto, pero
necesarios en el trascurso de éste) y
Release (hitos o entregas).
Después tenemos la opción Points,
donde asignamos el coste, siguiendo un
baremo, ya sea lineal (1,2,3…), de
Fibonacci (1,2,5,8…) o una personalizada.
La última opción a destacar es el
apartado Tasks, que son las tareas más
específicas dentro de la historia de usuario.
Una vez que la hemos terminado
pulsamos Save para guardarla en el apartado Icebox. Posteriormente, cuando
la tengamos en Backlog o Current, podremos cambiar su estado: Unstarted,
Started, Finished, Delivered, Rejected o Accepted.
Ilustración 2: Apartado de Historias de Usuario
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 16
2.4. Herramienta de diseño: Visual Paradigm
(https://www.visual-paradigm.com/)
Esta herramienta es de las más potentes a la hora de realizar diagramas
de diseño, teniendo una gran variedad de tipos de diagramas disponibles (de
clases, de flujo, de actividad, de comunicación, etc.).
En mi caso, lo he utilizado para hacer los diagramas de clases de todo
mi sistema, como veremos más adelante.
En cuanto a la interfaz de la herramienta, tenemos multitud de opciones,
quedándonos en este caso con la parte de diagramas.
Arriba vemos las pestañas, entre ellas ‘Project’ y ‘Diagram’, donde
podemos crear un proyecto nuevo y añadir diagramas nuevos,
respectivamente. En la parte izquierda vemos los iconos para añadir elementos
al diagrama de clases, como clases o relaciones.
Ilustración 3: Interfaz de Visual Paradigm
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 17
3. PLANIFICACIÓN
Como ya se ha dicho anteriormente, para este proyecto se utilizará la
metodología de desarrollo ágil Scrum. Está técnica se ajusta perfectamente a
nuestro caso, y en general a cualquier desarrollo en el que tengamos una fecha
límite de entrega y una lista de requisitos más o menos improvisada. También
es muy adecuada para el trabajo en equipo, puesto que continuamente
tenemos reuniones de grupo, en las que se reparten tareas y se hace un
seguimiento del trabajo hecho y por hacer.
3.1. ¿Qué es Scrum?
La metodología Scrum [3] sigue unas pautas para el trabajo en equipo,
de manera que sea lo más eficiente posible.
En Scrum se realizan entregas parciales con cierta regularidad,
priorizando las funcionalidades incluidas según lo estipulado con el cliente. Por
esto, es recomendable usar Scrum en entornos de trabajo complejos, donde
tenemos que obtener resultados pronto, los requisitos cambian a menudo o no
están del todo claros, o en el caso de que la innovación o la improvisación sean
fundamentales.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 18
3.2. Roles en Scrum
Dentro del equipo de trabajo de Scrum hay varios roles esenciales para
el buen funcionamiento del proyecto:
Cliente (o Product Owner): Representa a la persona o personas
interesadas en los resultados del proyecto, y actúa como interlocutor
ante el equipo, teniendo autoridad para tomar decisiones.
Define los objetivos del proyecto y dirige la lista de requisitos,
sabiendo el valor que aporta cada uno, repartiéndolos en iteraciones y
programando las entregas. En caso de ser necesario, replanifica el
proyecto en función de los requisitos que se hagan más necesarios.
Facilitador (o Scrum Master): Se encarga de liderar al equipo, de manera
que se sigan en todo momento las reglas de Scrum, y guiando la
colaboración entre los grupos de trabajo. También organiza las
reuniones de Scrum (planificación de la iteración, reuniones diarias, de
demostración y de retrospectiva).
Elimina los posibles impedimentos que pueda haber en el equipo,
ya sean externos o internos. Esto ayuda a la mayor productividad de
cada uno de los miembros.
Equipo (o Team): Grupo de personas que desarrollan el proyecto de
forma conjunta. El tamaño del equipo está entre 5 y 9 personas, ya que
con menos habría problemas en caso de que algún miembro faltase, y
con más habría problemas de comunicación y organización. En este
último caso la mejor solución es hacer subgrupos.
Se recomienda que los miembros de un mismo equipo trabajen
juntos físicamente, para mejorar la comunicación. También es
aconsejable que el equipo sea estable a lo largo del proyecto, para
aprovechar la relación adquirida entre los miembros.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 19
3.3. Fases de la metodología
En Scrum un proyecto se divide en bloques de tiempo cortos y fijos,
llamados iteraciones, de entre dos semanas y un mes. En cada iteración
debemos obtener un resultado completo, es decir, algo que el cliente pueda ver
o probar, y comprobar que se están cumpliendo sus requerimientos.
Al principio partimos de una lista de requisitos ordenada por prioridad,
también llamada Product Backlog. Esta priorización viene dada por el cliente,
que debe tener en cuenta el valor que aporta al proyecto y su coste. Una vez
tengamos la lista, se repartirán en iteraciones y entregas.
Las actividades que se realizan en Scrum son:
Planificación de la iteración: El primer día de la iteración se convoca una
reunión para seleccionar los requisitos que el cliente quiere incluir en
esta iteración, de manera que el equipo de trabajo pueda preguntar
dudas o ajustar alguna tarea en el tiempo.
Después, el equipo estima el esfuerzo necesario de cada requisito
y se reparten las tareas.
Ejecución de la iteración: Cada día el equipo realiza una breve reunión
de sincronización, donde se ve el trabajo que cada miembro del equipo
va realizando. Cada uno expone el trabajo realizado desde la anterior
reunión, lo que va a hacer a partir de ahora y si tiene algún problema
con el trabajo que tiene asignado.
Durante la iteración, el Scrum Master se encarga de que el equipo
pueda cumplir los objetivos, resolviendo problemas externos que puedan
surgir.
Inspección y adaptación: El último día de la iteración se realiza una
reunión de revisión de la misma. En ella, el equipo muestra al cliente los
requisitos completados en la iteración. En función de los resultados
mostrados y de los posibles cambios que haya habido en el contexto del
proyecto, el cliente deberá adaptar la planificación de lo que quede de
proyecto, si es necesario.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 20
También se lleva a cabo una reunión de retrospectiva, en la que el
equipo analiza todo lo ocurrido a lo largo de la iteración, problemas
encontrados y posibles mejoras para el futuro.
3.4. Adaptación de Scrum a este proyecto
Al aplicar esta metodología a nuestro caso, hay algunos aspectos que no
podemos utilizar. Por ejemplo, en el caso de las reuniones, al ser un trabajo
individual no tiene sentido.
Aun así, podemos seguir las demás funcionalidades de Scrum, la pila de
producto, las historias de usuario, el uso de iteraciones, etc.
3.5. Resumen de las iteraciones
1. Planteamiento inicial (2 semanas, desde el 1 de febrero hasta el 14 de
febrero): En esta iteración se definieron los aspectos iniciales del proyecto,
como es el caso de la metodología de planificación, el motor de videojuegos
a utilizar, el lenguaje de programación y las demás herramientas.
Por supuesto también se decidió el tipo de juego que se iba a
realizar, no tanto en temas artísticos, sino en cuanto a la estructura de éste,
con las posibles entidades que habría que incluir.
2. Estructura del videojuego (2 semanas, desde el 15 de febrero hasta el
28 de febrero): Aquí se generaron las primeras historias de usuario, dando
forma a las ideas adquiridas en la anterior iteración. Se decidió hacer un
sistema de misiones, con sus diferentes tipos, así como ofrecer
recompensas en forma de objetos.
Además, se ofrecería al jugador un sistema de compra de objetos y
de forja de armas y equipo usando los objetos conseguidos.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 21
3. Diseño e implementación del sistema de objetos (2 semanas, desde el
29 de febrero hasta el 13 de marzo): Aquí se incluyen las clases de los
apartados 6.1 (objetos) y 6.4 (inventario y mochila).
4. Diseño e implementación del personaje y las habilidades (2 semanas,
desde el 14 de marzo hasta el 27 de marzo): En esta iteración se crearon
las clases para la gestión de las estadísticas del personaje (6.2) y el sistema
de habilidades (6.3). Cabe decir que en esta fase aún no se incluyó la parte
de control ni personalización del personaje, ya que eso viene en iteraciones
posteriores.
5. Diseño e implementación del equipo (1 semana, desde el 28 de marzo
hasta 3 de abril): En esta fase se decidió qué tipos de equipo distintos
habría, así como los atributos que debía tener cada uno. Estas clases están
en el apartado 6.5.
6. Diseño e implementación del sistema de misiones (2 semanas, desde
el 4 de abril hasta 17 de abril): A estas alturas ya tenía claro qué tipo de
misiones habría en el juego, de recolección de objetos o de combate contra
enemigos. De todas formas, se ha intentado desarrollar un sistema que
permita incluir otros tipos de misiones de forma sencilla, con vistas al futuro.
Todas las clases incluidas en este conjunto están en el apartado 6.6.
7. Diseño e implementación de la parte lógica de los enemigos (2
semanas, desde el 18 de abril hasta 1 de mayo): En esta iteración se
desarrollaron parte de las clases incluidas en el apartado 6.7, donde se
definen los atributos de los enemigos, así como la colección donde se
guardan los distintos tipos que hay en el juego.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 22
8. Comienzo de la realización de la memoria (1 semana, desde el 2 de
mayo hasta el 8 de mayo): En este caso dejamos un poco de lado el
desarrollo práctico para centrarnos en la documentación, empezando por
incluir toda la información útil acerca de Unity y las demás herramientas, así
como los diagramas de clases de lo desarrollado hasta el momento,
explicando los atributos y métodos.
9. Desarrollo del sistema de guardado y carga de datos (1 semana, desde
el 9 de mayo hasta el 15 de mayo): Durante esta etapa investigué sobre
cuál era la mejor forma de guardar y cargar los datos del juego, escogiendo
finalmente la serialización. Tras esto, había que definir qué clases utilizarían
este sistema. Esto viene explicado en el apartado 6.11.
10. Comienzo de la etapa de desarrollo de interfaces (4 semanas, desde el
16 de mayo hasta el 12 de junio): A partir de esta iteración cambiamos un
poco la metodología de desarrollo, ya que anteriormente trabajábamos con
código, pasando ahora a diseñar sobre el editor de Unity. Durante esta
etapa se realizó una interfaz básica para el menú principal, la interfaz
durante una misión (indicador de salud, potenciadores de ataque y defensa,
etc.), el menú de pausa, y el acceso rápido a objetos. Posteriormente
también se hizo la interfaz para la casa del jugador, incluyendo los menús
de mochila e inventario, entre otros, así como la interfaz para la tienda y la
forja, teniendo muchos aspectos en común.
Al acabar esta iteración se generó el primer prototipo jugable,
explicado en la siguiente sección.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 23
11. Diseño del personaje controlable (3 semanas, desde el 13 de junio
hasta el 3 de julio): Durante esta iteración traté de obtener un personaje
con diferentes movimientos, y que se manejara de manera sencilla. Para
ello empecé por buscar un modelo adecuado al tipo de juego, así como
animaciones que pudiera aplicarle.
Una vez que tenía ambas cosas, lo siguiente era generar una
máquina de estados para coordinar el control con el movimiento del
personaje, así como la parte de personalización. Todo esto viene detallado
en el apartado 6.2.
12. Diseño de los enemigos (2 semanas, desde el 4 de julio hasta 17 de
julio): Al igual que con el personaje, había que incluir modelos y
animaciones para los enemigos, obtenidos de varios sitios. Tras esto había
que definir un comportamiento de inteligencia artificial, que hiciera al
enemigo acercarse a nosotros y atacar. En el apartado 6.7 se explica con
más detalle.
13. Diseño de escenarios para misiones (2 semanas, desde el 18 de julio
hasta el 31 de julio): Una vez que tenemos todos los elementos
interactuables necesarios, nos faltan los escenarios en los que transcurrirán
las misiones. Para su creación usamos las herramientas de modelado de
terrenos de Unity, que nos permite dar relieve y aplicar texturas a la escena.
Además, he incluido elementos como rocas, árboles y agua, a los
que he añadido funcionalidades para obtener objetos de ellos. Más detalles
en el apartado 5.6.
14. Diseño del escenario de la aldea (1 semana, desde el 1 de agosto hasta
el 7 de agosto): Para esta escena se han necesitado modelos de edificios y
otros elementos, como barriles, cajas o vallados. Además se han incluido
funcionalidades para poder cambiar de escena al entrar en los distintos
establecimientos, así como personajes no controlables (NPC) con sus
respectivos diálogos.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 24
15. Selección de elementos sonoros y gráficos (1 semana, desde el 8 de
agosto hasta el 14 de agosto): Esta fase es la última en cuanto al
desarrollo del videojuego. En ella se escogieron los recursos sonoros
(música de fondo y efectos de sonido) y gráficos (fondos para los menús,
iconos y diseños de botones).
16. Fase de pruebas (1 semana, desde el 15 de agosto hasta el 21 de
agosto): Durante esta etapa estuve probando el juego para comprobar su
rendimiento en un uso normal, así como intentar buscarle fallos que pudiera
arreglar.
17. Finalización de la memoria (2 semanas, desde el 22 de agosto hasta el
31 de agosto): Por último, solo quedaba terminar la parte de
documentación, incluyendo las valoraciones finales acerca del resultado
final del desarrollo, así como los objetivos a completar como trabajo futuro,
de cara a una futura comercialización del producto.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 25
3.6. Gráfico de iteraciones
Ilustración 4: Gráfico resumen de las iteraciones
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 26
3.7. Prototipos
Primer prototipo: Pequeña escena donde probamos a recolectar objetos,
usarlos o consultar el estado de la mochila. Obtenido tras la iteración 10.
Segundo prototipo: Una vez que tenemos la escena de la aldea,
probamos a elegir una misión y completarla correctamente. Obtenido
tras la iteración 11
Ilustración 5: Imágenes del primer prototipo
Ilustración 6: Imágenes del segundo prototipo
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 27
Tercer prototipo (primera versión jugable): Tenemos casi todas las
escenas funcionales: menú principal, aldea, tienda, forja, casa del
jugador, puesto de misiones y un par de escenas para el transcurrir de
las misiones. Además tenemos un personaje personalizable con equipo
que conseguimos en el juego, y algunos enemigos con los que podemos
interaccionar. Obtenido tras la iteración 13.
Cuarto y último prototipo: Ya tenemos todas las escenas, con sus menús
al completo. Ya podemos desarrollar una partida normal, desde el menú
principal hasta la última misión disponible.
Ilustración 7: Imágenes del tercer prototipo
Ilustración 8: Imágenes del cuarto prototipo
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 28
4. PRESUPUESTO
4.1. Recursos humanos
Para la estimación de costes en cuanto a trabajo personal, he supuesto
una jornada de 8 horas diarias y 6 días por semana, obteniendo estos datos:
Tarea Horas
dedicadas
Precio por
hora Coste
Planificación y diseño
inicial 96 5 € 480 €
Diseño 120 8 € 960 €
Implementación 264 8 € 2112 €
Modelado 72 8 € 576 €
Animación 48 8 € 384 €
Audio y gráficos 72 5 € 360 €
Pruebas 48 4 € 192 €
Documentación 96 4 € 384 €
816 5448 €
Tabla 1: Estimación de costes en recursos humanos
4.2. Recursos materiales
En cuanto a recursos software, he apostado por usar herramientas
gratuitas en la medida de lo posible, empezando por el propio motor de
videojuegos, Unity 5.
Además también se ha utilizado Visual Paradigm para la elaboración de
diagramas, por medio de una licencia Student ofrecida por la Universidad de
Jaén, gracias a la cual he podido usar esta herramienta de forma gratuita.
También he usado Microsoft Word 2010 para la elaboración de esta
memoria, así como diversas herramientas web, como Pivotal Tracker, todas
ellas gratuitas.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 29
Por el lado del hardware, se ha usado un PC portátil ASUS K52JU, con
procesador Intel Core i3 y sistema operativo Windows 7 Home Premium de 64
bits valorado en unos 550 €. Teniendo en cuenta la vida útil del equipo y el
tiempo que dura el proyecto, he supuesto una amortización de 110 €.
También se ha utilizado un Joystick inalámbrico NetWay NW498 cuyo
precio aproximado es de 25 €.
En total, serían unos 135 €.
4.3. Presupuesto total
En total, el coste del proyecto sería el siguiente:
Recursos humanos 5448 €
Recursos materiales 135 €
5583 €
Tabla 2: Estimación de costes totales
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 30
5. ANÁLISIS INICIAL
En el análisis inicial se recogen todos los aspectos planteados antes de
empezar el diseño, relacionados a la jugabilidad, los escenarios donde
transcurre el juego, el personaje, los objetos, etc.
5.1. Tipo de juego (High Concept Document / Game
Treatment Document)
Este juego pretende mezclar dos estilos diferentes. Por un lado, se
pretende tener características del género rol o RPG, teniendo un personaje que
evoluciona a lo largo del tiempo. Por otra parte, se quiere tener un juego de
acción en tercera persona, con momentos de lucha contra distintos enemigos,
que nos permitan superar misiones y lograr objetivos.
Durante el transcurso del juego tendremos que ir superando misiones
que se nos entregaran en una especie de poblado o aldea base, y que nos
permitirán acceder a otras misiones cada vez más complejas. A su vez
deberemos conseguir diferentes materiales con los que crear y mejorar nuestro
equipo, incluyendo armas, armaduras y otras piezas. Estos materiales se
pueden obtener de diferentes formas, ya sea acabando con enemigos,
recolectando en los escenarios o como recompensa de misiones, o
comprándolos en las diferentes tiendas.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 31
5.2. Resumen de la historia
Llegamos a una aldea perdida en medio de la nada para ayudar a sus
habitantes a combatir a una serie de enemigos que han aparecido cerca de allí.
Ellos nos ayudarán en todo lo posible con esta dura tarea, ya que nos
proporcionarán objetos, armas y demás equipamiento.
Pero para que puedan darnos estos recursos nos hará falta dinero y
materiales, los cuales debemos conseguir en los escenarios, a los que
llegaremos a través de las misiones que deberemos aceptar en la aldea. De
esta manera podremos llegar a distintas zonas y enfrentarnos a multitud de
enemigos.
5.3. Características del personaje (Character Design
Document)
Tenemos un personaje controlable con una cámara en tercera persona.
Este personaje tiene una serie de estadísticas (stats) que definen su potencial,
tales como Puntos de Salud, Ataque o Defensa, y una serie de habilidades que
se consiguen mediante el uso de determinados equipamientos, como un
aumento de ataque permanente, mayor cantidad de Puntos de Salud o
mayores recompensas al acabar las misiones.
5.3.1. Estadísticas del personaje
PS (Puntos de salud): Es la salud máxima del personaje.
Ataque: Es el valor de ataque de nuestro arma.
Defensa: Es la suma del valor de defensa de la armadura y el escudo.
Ataque elemental: Es el valor de ataque elemental del arma.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 32
5.3.2. Habilidades
Las habilidades son un aspecto muy a tener en cuenta a la hora de
escoger un equipamiento u otro. Una armadura puede llevar asociada unos
puntos de habilidad, que sumándose a los de las demás partes, nos puede
permitir activar una o varias habilidades, y así tener ventaja en ciertos
momentos, permitiéndonos aguantar mejor los golpes, atacar con más potencia
o recibir mejores recompensas al cumplir las misiones, entre otros usos.
En esta lista tenemos las diferentes habilidades que podremos usar en el
juego:
Nombre Puntos
necesarios Efecto
Ataque +
10 Ataque x 1.1
15 Ataque x 1.25
20 Ataque x 1.5
Defensa +
10 Defensa x 1.1
15 Defensa x 1.25
20 Defensa x 1.5
Más PS
10 PS x 1.25
15 PS x 1.5
20 PS x 2
Más ítems*
10 Núm. Ítems x 1.25
15 Núm. Ítems x 1.5
20 Núm. Ítems x 2
Más dinero**
10 Dinero x 1.5
15 Dinero x 2
20 Dinero x 3
Ataque Elemental + 10 Ataque elemental x 1.25
15 Ataque elemental x 1.5
Tabla 3: Lista de habilidades
* Items recibidos al completar una misión
** Dinero recibido al completar una misión
Los valores que se aplican en las habilidades, así como en todas las instancias
del juego, han sido obtenidos tras multitud de pruebas, haciendo hincapié en el
equilibrio, de forma que no se nos haga demasiado difícil o fácil en según qué
casos.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 33
5.4. Equipo
El equipo lo podremos conseguir de diferentes maneras, ya sea
comprándolo en tiendas o creándolo a partir de materiales que hayamos
conseguido.
Podemos cambiar el equipo en la casa del personaje, así como ver
información detallada de las estadísticas y los puntos de habilidad.
5.4.1. Armas
Con respecto a las armas, debemos saber que son las que definen
nuestro stat de ataque. Cada arma tiene un cierto valor de ataque base,
pudiendo complementarse con un cierto valor de ataque elemental mediante un
revestimiento (ver apdo. 5.4.2), como Fuego, Agua o Veneno, afectando en
mayor o menor medida a según qué enemigos.
Estas son las armas disponibles en este prototipo:
Icono Nombre Ataque Icono Nombre Ataque
Espada de hierro 150
Espada metalizada
500
Espada oxidada 75
Espada maligna 600
Espada de madera
180
Espada de oro 1000
Espada de ébano 275
Espada divina 2500
Espada petrificada
350
Tabla 4: Lista de armas presentes en el juego
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 34
5.4.2. Revestimiento para el arma
El revestimiento es un bonus que nos permite mejorar aún más el ataque
de nuestra arma, permitiendo darle un poder elemental. Tenemos los
siguientes tipos: fuego, agua, hielo, rayo, veneno, luz y sombra.
Este extra puede llegar a ser muy importante en los combates, ya que a
cada enemigo le afectan de manera diferente los distintos tipos, y debemos
usarlo a nuestro favor. Por ejemplo, hay enemigos que son débiles al fuego,
pero resistentes al agua, por lo que sería conveniente llevar un revestimiento
de tipo fuego para derrotar a este tipo de enemigo con menor dificultad.
5.4.3. Armaduras
Por parte de las armaduras, éstas definen parte del stat de defensa de
nuestro personaje. Poseen un valor de defensa base y una serie de valores
que indican el daño que recibimos de cada tipo de ataque. También pueden
tener asociadas unos puntos de habilidad, que sumados a los que pueden
tener el escudo y el emblema equipados, nos permiten activar habilidades. Esto
nos obliga a estudiar qué armadura es mejor para luchar contra cierto enemigo,
y disponer de equipo variado a lo largo de la aventura.
En la siguiente tabla tenemos todas las armaduras disponibles en el
prototipo, junto a sus datos:
Ilustración 9: Tipos de revestimiento
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 35
Icono Nombre Defensa Puntos de habilidad
Daño elemental
Coraza de hierro
100 -
x 1
x 1
x 1
x 1
x 1
x 1
x 1
x 1
Ropas naturales
250 Ataque +: 10
x 1
x 0.5
x 1.5
x 1
x 1.5
x 1
x 0.5
x 0.2
Armadura iridiscente
300 Ataque
elemental +: 7
x 1
x 1.2
x 0.7
x 1
x 1.5
x 0.6
x 1.5
x 0.5
Armadura de Serie-MG
300 Defensa +: 12
x 0.7
x 0.5
x 1.5
x 0.1
x 1
x 1
x 1
x 1
Armadura oscura
350 Ataque +: 12
x 1
x 1.3
x 1.2
x 1
x 0.8
x 1.8
x 0.5
x 0.2
Blindaje escarlata
500 Más ítems: 10 Más dinero: 9
x 1
x 1.3
x 0.5
x 1
x 0.5
x 1
x 1.2
x 1.2
Armadura dorada
1200 Más PS: 9
Más dinero: 11
x 1
x 0.5
x 1.5
x 0.3
x 1.5
x 1
x 0.8
x 1
Armadura divina
1600 Ataque +: 14
Defensa +: 14
x 1
x 1
x 1
x 1
x 1
x 1
x 1
x 1
Tabla 5: Lista de armaduras presentes en el juego
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 36
5.4.4. Escudos
En cuanto a los escudos, cumplen una función similar a la armadura,
puesto que también tienen un valor de defensa y unos indicadores de daño
según el tipo de daño elemental que recibamos. Además, pueden llevar puntos
de habilidad.
En la siguiente página tenemos una lista con los escudos disponibles en
esta versión del juego.
5.4.1. Emblemas
Los emblemas cumplen una función muy específica dentro de nuestro
equipamiento, ya que solo nos servirán para sumar puntos de habilidad a los
que nos aportan la armadura y el escudo.
A priori puede parecer poca cosa, pero pueden ser muy importantes a la
hora de conseguir una habilidad útil para cierta misión, ya que los emblemas
sumarán puntos en habilidades difíciles de conseguir, de manera que nos
vendrá bien tener unos cuantos en nuestro inventario.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 37
Imagen Nombre Defensa Puntos de habilidad
Daño elemental
Escudo precario 50 -
x 1
x 1
x 1
x 1
x 1
x 1
x 1
x 1
Escudo resistente 110 -
x 1
x 0.7
x 1.2
x 1
x 1.2
x 1.1
x 1
x 0.8
Escudo sellado 300 Ataque +: 7
Ataque elemental +: 9
x 1.2
x 1
x 0.5
x 0.5
x 1.8
x 1.8
x 1
x 0.1
Escudo maldito 1200
Ataque +: 1 Defensa +: 5
Ataque elemental +: 1
x 1.2
x 0.8
x 1.1
x 1.1
x 0.7
x 1.5
x 0.6
x 0.4
Escudo modular 500 Defensa +:5 Más PS: 10
Más ítems: 3
x 1
x 1.3
x 1.4
x 0.3
x 1.2
x 0.6
x 0.8
x 1
Escudo antiguo 800 Más ítems: 13
x 1
x 0.8
x 1.7
x 1.5
x 1.3
x 1
x 1
x 0.6
Escudo de oro cromado
1400 Más ítems: 12 Más dinero: 15
x 1
x 0.8
x 1.2
x 1.5
x 1
x 1
x 1
x 0.6
Escudo radiante 1000 Defensa +: 11
Ataque elemental +: 8
x 1
x 0.4
x 0.7
x 1
x 1.1
x 0.1
x 1.3
x 0.4
Tabla 6: Lista de escudos presentes en el juego
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 38
5.5. Objetos
Los objetos son una parte muy importante en el transcurso del juego,
tanto los objetos consumibles (pociones, potenciadores, etc.) como los no
consumibles (materiales y objetos clave o coleccionables). Estos objetos se
almacenan en nuestro inventario, al que tenemos acceso siempre que estemos
en la aldea. También tenemos la mochila, que nos permite llevar un número
limitado de objetos a las misiones, pudiendo transferirlos libremente entre el
inventario y ésta.
5.5.1. Objetos consumibles
Estos objetos generalmente afectan al estado del personaje, ya sea
curándonos, aumentando defensa o ataque, u otros usos. Tendremos a nuestra
disposición un menú de acceso rápido que nos permita usarlos fácilmente en
un momento de apuro.
La mayoría de estos consumibles se pueden comprar en las tiendas o
recolectar masivamente en los distintos mapas del juego.
Icono Nombre Efecto
Poción Recuperas 25 puntos de salud.
Poción + Recuperas 50 puntos de salud.
Poción máxima Recuperas todos tus puntos de salud.
Proteínas Aumenta tu ataque x 1.25 durante 1 minuto.
Proteínas + Aumenta tu ataque x 1.5 durante 4 minutos.
Vitaminas Aumenta tu defensa x 1.25 durante 1 minuto.
Vitaminas + Aumenta tu defensa x 1.5 durante 4 minutos.
Agua templada Restaura 10 puntos de salud.
Agua fresca Restaura 30 puntos de salud.
Tabla 7: Lista de objetos consumibles
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 39
5.5.2. Objetos no consumibles (coleccionables o materiales)
Los materiales son la base en la creación y mejora de nuestro
equipamiento, ya que necesitaremos unos ítems determinados cada vez que
queramos conseguir equipo mejor. A diferencia de los objetos consumibles, los
materiales son más difíciles de conseguir, ya que se obtienen de los enemigos
que derrotamos o como recompensa de las misiones superadas. No obstante,
también podemos encontrar algunos más comunes recolectando en los
escenarios o comprarlos en tiendas.
Esta dificultad a la hora de conseguir ciertos materiales hace que
debamos repetir misiones que ya hayamos superado anteriormente, si
deseamos conseguir un determinado material que se obtiene de un enemigo
concreto.
Este sistema nos ayuda a controlar la línea de dificultad del juego, ya
que a medida que vamos superando misiones más difíciles, los materiales
obtenidos son más raros, pero a su vez nos permiten mejorar el equipo.
Icono Nombre Icono Nombre
Hierro
Madera
Grafito
Madera seca
Carbón
Madera oscura
Bronce
Pez plateado
Moneda de oro
Gran pez dorado
Tabla 8: Lista de materiales (sin contar los que sueltan los enemigos)
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 40
5.6. Escenarios (World Design Document)
Dentro del juego podemos distinguir dos tipos de escenarios, la aldea y
los mapas donde se desarrollan las misiones.
5.6.1. Aldea
En la aldea tenemos varias localizaciones importantes, como nuestra
casa, con un baúl donde almacenamos objetos y equipo. Aquí podemos
cambiar el arma equipada, la armadura y el resto del equipo, así como
intercambiar objetos entre el inventario y la mochila.
También tenemos el puesto de misiones, donde aceptamos encargos
que nos asignan en la aldea; la tienda, donde compramos y vendemos ítems y
equipo; y la forja, donde podemos crear armas y equipamiento.
Además, podemos hablar con los habitantes para que nos cuenten
cosas o nos den algún consejo.
Ilustración 10: Aldea
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 41
5.6.1.1. Casa
Dentro de la casa del personaje podemos acceder a la mayoría de
opciones que afectan a éste. Podemos acceder al inventario y a la mochila,
donde podremos intercambiar objetos entre ambas, y así poder llevar los
objetos necesarios a las misiones.
También podemos cambiar nuestro equipamiento, viendo los detalles de
cada uno; y comprobar nuestras estadísticas y habilidades activas.
Ilustración 11: Menú principal de la
casa
Ilustración 12: Inventario
Ilustración 13: Pantalla de estado
5.6.1.2. Tienda
En la tienda tenemos la opción de comprar o vender tanto objetos de
nuestro inventario como equipamiento. Además, se irá desbloqueando nuevo
stock según vayamos completando misiones, pudiendo acceder a mejores
objetos.
Ilustración 14: Menú principal de la tienda
Ilustración 15: Pantalla de compra de objetos
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 42
5.6.1.3. Forja
En la forja podremos crear nuevas armas, armaduras y escudos a partir
de los materiales que consigamos en las misiones.
5.6.1.4. Puesto de misiones
El puesto de misiones es uno de los puntos importantes en el juego, ya
que es donde podremos aceptar misiones, y así progresar. Las misiones están
clasificadas por categorías, según su dificultad, y se irán desbloqueando según
vayamos completando las que haya disponibles.
Ilustración 16: Menú principal de la
forja
Ilustración 17: Menú de selección de
armadura
Ilustración 18: Mensaje de
confirmación de compra
Ilustración 19: Menú principal del
puesto de misiones
Ilustración 20: Misiones del nivel
'Principiante'
Ilustración 21: Pantalla de
confirmación de misión
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 43
5.6.2. Mapas
Los mapas son escenarios a los que accedemos cuando aceptamos una
misión en la aldea. Cada misión transcurre en un mapa concreto, y en él
encontramos determinados enemigos y podremos conseguir ítems variados al
recolectar.
En el caso de que estemos en una misión de recolección,
encontraremos uno o varios baúles donde depositar objetos.
En este prototipo tenemos tres escenarios diferentes:
La escena de tutorial, muy sencilla, tan solo con un vallado.
La estepa, donde predomina la vegetación y los árboles, y donde
podremos encontrar minerales en las rocas.
Las ruinas, donde encontraremos un paisaje más otoñal, además de una
cascada donde podremos encontrar peces y recoger agua.
Ilustración 22: Escena de tutorial
Ilustración 23: Estepa
Ilustración 24: Ruinas
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 44
5.7. Misiones
Las misiones son la base del juego. Deberemos ir cumpliendo las que
nos vayan asignando en la aldea, y poco a poco iremos desbloqueando más,
cada vez más complejas. Las misiones tendrán asignado un nivel de dificultad:
Principiante, Avanzado y Experto.
Como recompensas, recibiremos una cantidad de objetos dependiendo
de la misión, así como dinero.
Las misiones pueden ser de dos tipos:
5.7.1. Misiones de entrega de materiales
En estas misiones el objetivo será entregar una serie de ítems que
podremos conseguir en los mapas, ya sea recolectando u obteniéndolos de los
enemigos. El lugar al que deberemos llevar los objetos puede variar, aunque a
menudo será un cofre que encontraremos en el punto de comienzo de la
misión.
Suelen ser las más sencillas, y pretenden hacer ver al jugador la
importancia de conseguir objetos a lo largo de las misiones.
Ilustración 25: Baúl de entrega de objetos
5.7.2. Misiones de combate
En este tipo de misiones, deberemos vencer a una serie de enemigos,
más o menos fuertes. Estos enemigos soltarán distintos objetos al ser
derrotados, que deberemos recoger para poder usarlos en la forja.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 45
5.8. Enemigos
Durante las misiones nos toparemos con diversos enemigos, que nos
atacarán si nos acercamos a una cierta distancia. Cada uno de ellos tiene unas
estadísticas diferentes de ataque, defensa, puntos de salud y valores de daño,
por lo que tendremos que adaptar nuestro equipo según a qué nos
enfrentemos.
Además, al ser derrotados nos entregarán algunos objetos, con los que
fabricaremos equipo en la forja.
Estos son los enemigos presentes en este prototipo (siguiente página):
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 46
Nombre e imagen Estadísticas Objetos que suelta
MG-100
Ataque: 50
Defensa: 100
Puntos de salud: 100
Placa de MG-100 60%
Batería de MG 25%
Microchip BETA 15%
MG-201
Ataque: 75
Defensa: 125
Puntos de salud: 150
Engranaje de MG-201 50%
Batería de MG 30%
Microchip BETA 20%
MG-500
Ataque: 100
Defensa: 175
Puntos de salud:
1000
Batería de MG 30%
Microchip BETA 35%
Procesador de MG-
500 25%
Lente infrarroja 10%
Ogronius
Ataque: 130
Defensa: 90
Puntos de salud: 150
Brazal de Ogronius 45%
Cinturon de Ogronius 35%
Intrajoya de Ogronius 15%
Alma de Ogro 5%
Ogrerion
Ataque: 95
Defensa: 125
Puntos de salud: 150
Garra de Ogrerion 45%
Hueso de Ogrerion 35%
Mineral de Ogrerion 15%
Alma de Ogro 5%
Ografio
Ataque: 110
Defensa: 110
Puntos de salud: 130
Diente de Ografio 45%
Craneo de Ografio 35%
Esfera de Ografita 15%
Alma de Ogro 5%
Tabla 9: Lista de enemigos
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 47
5.9. Interfaz de usuario (User Interface Design Document)
En este juego se ha intentado crear una interfaz intuitiva y que ayude al
usuario a progresar, ya sea mediante los diversos menús o proporcionando
elementos gráficos y sonoros durante la partida.
5.9.1. Menú principal
En cuanto empezamos el juego vemos el menú principal, donde
podemos elegir entre empezar una nueva partida, cargar una existente,
modificar algunas opciones o salir.
Si elegimos Nueva partida, se nos pedirá un nombre para nuestro
personaje y empezaremos la aventura.
Si por el contrario elegimos Cargar partida, continuaremos por donde lo
hubiéramos dejado la última vez.
En opciones podemos cambiar algunos parámetros, como la resolución
de pantalla, la calidad gráfica o si queremos que se nos muestren los controles
en pantalla.
Y en los créditos, toda la información acerca de la creación del juego.
Ilustración 26: Menú principal
Ilustración 27: Menú de selección
de nombre
Ilustración 28: Menú de opciones
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 48
5.9.2. Interfaz durante una misión
Una vez que empecemos una misión veremos que se añaden elementos
a la pantalla respecto a los que teníamos estando en la aldea. Éstos nos
ayudan a controlar nuestros puntos de salud, si tenemos un aumento de ataque
o defensa, o usar objetos consumibles.
5.9.2.1. Indicadores de estado
Arriba a la izquierda tenemos los indicadores de estado, que se
componen por una barra que marca los puntos de salud restantes y unos
iconos que aparecerán si tenemos un aumento de ataque o defensa.
5.9.2.2. Acceso rápido a objetos
En la parte inferior de la pantalla tenemos el acceso rápido a objetos,
que nos permite cambiar entre los objetos consumibles que tengamos y usarlos
al mismo tiempo que jugamos, sin tener que pausar el juego.
Ilustración 29: Indicador de puntos de salud
Ilustración 30: Indicador de estado con ataque y defensa aumentados
Ilustración 31: Acceso rápido a objetos (cerrado)
Ilustración 32: Acceso rápido a objetos (abierto)
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 49
5.9.3. Menú de pausa
En el juego tenemos dos menús de pausa distintos, según estemos en
una misión o en la aldea.
Si estamos en la aldea, el menú de pausa nos permite salir al menú
principal guardando nuestro progreso.
Ilustración 33: Menú de pausa en la aldea
En cambio, si estamos en una misión, el menú es más completo.
Podemos ver los objetos de la mochila, los objetivos de la misión y la opción de
abandonar la misma.
Ilustración 34: Menú de pausa durante
una misión Ilustración 35: Menú de la mochila
Ilustración 36: Objetivos de la misión
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 50
5.9.4. Pantalla de recompensa
Cuando finalizamos una misión, se nos entregan unos objetos de
recompensa, que podemos enviar al inventario o vender.
5.9.5. Pantalla de carga
La pantalla de carga está pensada para cargar los recursos en segundo
plano, pero en este caso también se han añadido consejos que ayudarán al
jugador a aprender mecánicas de juego. Estas “pistas” aparecen
aleatoriamente.
Ilustración 38: Pantalla de carga
Ilustración 37: Pantalla de recompensas
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 51
5.9.6. Sistema de notificaciones
A lo largo de la partida hay muchos eventos que el jugador debe
conocer. Para esto, se ha incluido un sistema de notificaciones, que hará
aparecer un mensaje en la esquina superior derecha.
Varios ejemplos de notificaciones son:
Al aceptar una misión, se nos informa a donde ir para comenzarla.
Cuando recogemos un objeto vemos cuál es.
Al comprar o forjar algo, se muestra un mensaje confirmándolo.
5.9.7. Efectos visuales
Se han añadido algunos efectos visuales en los menús, como los
cambios de color en los botones para distinguir con claridad el que está
seleccionado.
También hay otros elementos visuales a destacar, como un efecto de
color en la espada si llevamos un revestimiento aplicado en nuestra arma, de
manera que se iluminará de rojo si el revestimiento es de fuego, azul si es de
agua, etc.
Ilustración 40: Efecto de color del arma
Ilustración 39: Ejemplos de notificaciones
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 52
5.9.8. Efectos sonoros
En el juego hay multitud de efectos de sonido, empezando por los
menús, donde tenemos un sonido al seleccionar un botón y pulsarlo, así como
cuando abrimos o cerramos un menú, o en las notificaciones (ver apdo. 5.8.6).
Por supuesto, durante una misión tendremos audio en los enemigos,
emitiendo sonidos al entrar en su radio de visión, atacarles o caer derrotados,
además de los sonidos propios del arma al impactar.
Respecto a la banda sonora, se ha incluido música de fondo en todas las
escenas del juego, obtenida de fuentes con licencia libre [R2], aunque la
intención sería añadir música de composición propia, de cara a una futura
comercialización del producto.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 53
5.10. Situaciones de juego (Flowboard)
Durante el transcurso del juego tendremos diferentes situaciones de
juego, en las que los controles y las posibles acciones irán variando.
Una vez iniciamos el juego, nos encontramos con el menú principal,
donde podemos navegar por los botones (ver apdo. 5.8.1), pudiendo elegir
entre las opciones.
Si elegimos iniciar una nueva partida, deberemos introducir nuestro
nombre. Tras esto iniciaremos el tutorial para conocer los controles básicos.
A continuación estaremos en la aldea, donde ya podremos controlar a
nuestro personaje, pudiendo andar o correr, así como hablar con los
personajes NPC que nos encontraremos y entrar en los edificios (casa, tienda,
etc.). También podemos pausar el juego para salir.
Al entrar en la casa, ya no podremos manejar al personaje, solo navegar
por los menús, al igual que en la tienda, la forja o el puesto de misiones. Aun
así, podremos ver a nuestro personaje moverse mediante animaciones.
Al pasar por el puesto de misiones y escoger una misión, nos tendremos
que dirigir a la salida de la aldea para empezarla. Una vez que hayamos
llegado a nuestro destino, podremos controlar a nuestro personaje con más
acciones, como son los distintos ataques y el uso de objetos. Al igual que en la
aldea, podemos pausar la partida, pero en esta ocasión tendremos más
opciones disponibles, entre ellas abandonar la misión y volver a la aldea.
Si la misión elegida es de recolección, el objetivo será entregar los
objetos que se nos pidan en el baúl de entrega. Si la misión es de combate,
deberemos acabar con los enemigos que nos pidan. En ambos casos, al
completar la misión, se nos entrega la recompensa y decidiremos si enviarla al
inventario o venderla.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 54
Aldea
Misión
Menú principal Elegir nombre
Casa
Tienda
Forja
Puesto de misiones
Misión de recolección Misión de combate
Recompensa
Nueva partida
Cargar partida
Completar misión
Aceptar misión
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 55
5.11. Evolución del juego (Story and Level Progression
Document)
El objetivo final del juego es ir completando misiones, hasta llegar al jefe
final. En esta versión, al ser un prototipo, solo tenemos unas cuantas misiones,
mostrando los distintos tipos que hay.
Las misiones se van desbloqueando en cadena, es decir, al completar
una misión, se desbloquean otras, y así sucesivamente. Con ello, también se
van desbloqueando nueva mercancía en la tienda, y nuevas opciones para la
forja al tener acceso a nuevos materiales.
Las misiones disponibles en esta versión son:
Nombre Tipo Objetivo Nivel
Explorando la
estepa Recolección
Entregar 3 minerales Hierro y 8
trozos de Madera Principiante
Registrando las
ruinas Recolección Entregar una Moneda de oro Principiante
Maquinaria
Ligera Combate Derrotar 5 MG-100 Principiante
Escasez de metal Recolección Entregar materiales de los
enemigos Avanzado
Maquinaria
pesada Combate Derrotar al MG-500 Experto
Intrusos
nocturnos Combate Derrotar a todos los enemigos Avanzado
Tabla 10: Lista de misiones
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 56
6. DISEÑO E IMPLEMENTACIÓN
En cuanto al diseño e implementación de las clases que forman el
videojuego, se ha intentado agruparlas en módulos, según la relación o
dependencias que haya entre ellas.
En resumen, tenemos varios grupos:
- Objetos y su uso
- Gestión de las estadísticas y características del personaje
- Sistema de habilidades
- Almacenamiento de objetos (Inventario y Mochila)
- Equipamiento (armas, armaduras, etc.)
- Enemigos
- Mercancía en la tienda y la forja
- Elementos de interfaz
- Audio
- Guardado y carga de datos
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 57
6.1. Sistema de objetos
En este apartado, tenemos la clase Item, una estructura de
almacenamiento ItemDatabase, y la clase ItemEffect y subclases que
representan los distintos usos de los objetos consumibles.
Diagrama 1: Sistema de objetos
6.1.1. Clase Item
Dentro de la clase Item tenemos los atributos básicos: id, nombre,
descripción, cantidad máxima para la mochila, valor (precio de compra/venta),
una variable que dice si se puede consumir o no y el icono que se mostrará en
los menús del juego.
También se define un efecto (ver apdo. 6.1.2), que diferenciará a los
objetos consumibles de los no consumibles; y el tipo de objeto, que es más
bien informativo.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 58
Como métodos, tenemos los getter de todos los atributos, dado que
éstos últimos son privados; el constructor, en el que le pasamos todos los datos
para la creación; y el método UseItem, que se usará en el transcurso de una
misión, y que afectará a las estadísticas del jugador, de ahí que se le pase un
objeto de tipo IG_Player (ver apdo. 6.2.2).
6.1.2. Clase ItemEffect
Esta clase es abstracta e implementa el patrón Estrategia [9], ya que
define un método abstracto UseItem, que nos obliga a redefinir en sus
subclases. Estas subclases son cada uno de los diferentes comportamientos
que podrán tener los objetos consumibles: restaurar puntos de salud o
aumentar nuestro ataque o defensa durante un tiempo determinado.
En la subclase RestoreHealth, tenemos el constructor, al que le
pasamos como parámetro los puntos de salud que recuperará el jugador al
usar el objeto.
Para las otras dos subclases, los constructores reciben como
parámetros el aumento de ataque o defensa, siendo un multiplicador mayor
que 1. Por ejemplo, un valor de 1.25 aumentará la estadística un 25%. También
le indicamos el tiempo que durará el efecto, en segundos.
En las tres subclases se redefine el método UseItem, que llamará a la
función correspondiente de la clase IG_Player (ver apdo. 6.2.2).
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 59
6.1.3. Clase ItemDatabase
Como se puede observar en el diagrama 1, esta clase está basada en el
patrón Singleton [8], cuya principal utilidad es el acceso global a una instancia
estática de ésta.
Para almacenar todos los objetos diferentes del juego usamos un
Dictionary [6], una colección que guarda pares <clave, valor>. Esto nos permite
buscar por clave de manera eficiente.
Para la búsqueda, tenemos dos métodos: GetItemWithID para buscar
por ID, que además es la clave en la colección y hará más eficiente la
búsqueda; y GetItemWithName que hará una búsqueda lineal por todas las
tuplas, por lo será usado en caso de que nos sea complicado utilizar la anterior.
Por último, tenemos la función ItemDatabaseSize, que nos devuelve el
número de tuplas de la colección.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 60
6.2. Gestión del personaje
Para manejar la información del personaje, como son las estadísticas, el
nombre o el equipamiento actual, tenemos dos grandes clases: Player e
IG_Player (‘IG’: In-game).
La primera usa el patrón Singleton [8] y es global en todo el juego, la
segunda está asociada al GameObject del propio personaje y controla las
estadísticas durante las misiones.
6.2.1. Clase Player
Diagrama 2: Clase Player
Como se ha indicado anteriormente, esta clase implementa el patrón
Singleton, lo que permite que tengamos acceso global a la instancia desde
cualquier parte del código. En ella tenemos los atributos básicos del personaje,
como el nombre o el dinero.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 61
Además tenemos las estadísticas de PS (Puntos de Salud), Ataque,
Ataque elemental y Defensa; cada una representada por dos variables, que se
obtienen de la siguiente manera:
stat_PS_base: Puntos de salud del personaje (por defecto, 100).
stat_Attack_base: Ataque base del personaje, obtenido del valor de
ataque del arma que lleve equipada en ese momento.
stat_ElementalAttack_base: Ataque elemental base del personaje,
obtenido del revestimiento que lleve el arma equipada (si no hay
ninguno, valdrá cero).
stat_Defense_base: Defensa base del personaje, obtenida la suma del
valor de defensa de la armadura y del escudo equipados.
totalPS: A partir de stat_PS_base, se modifica si alguna habilidad afecta
al número de puntos de salud.
totalAttack: A partir de stat_Attack_base, cambiará si una habilidad
afecta al stat de ataque.
totalElementalAttack: A partir de stat_ElementalAttack_base, cambiará si
una habilidad afecta al stat de ataque elemental.
totalDefense: A partir de stat_Defense_base, cambiará si una habilidad
afecta al stat de defensa.
Además, tenemos una referencia a cada uno de los elementos
equipables (arma, revestimiento, armadura, escudo y emblema), así como una
lista con las habilidades activas, otra lista con los puntos de habilidad, y otra
con los índices de daño para cada tipo de ataque recibido.
En cuanto a métodos, tenemos para guardar o cargar los datos de la
clase (ver apdo. 6.11), y para equipar cada una de las partes del equipo,
usando las restantes que actualizan tanto las habilidades como los índices de
daño.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 62
6.2.2. Clase IG_Player
Este script va asignado al GameObject del personaje, es decir, se
ejecuta durante la ejecución de cada escena, usando los atributos ps, attack,
defense y elementalAttack para calcular tanto el daño que infligimos a los
enemigos como el que recibimos de ellos.
También vemos que tenemos referencias tanto al Animator como al
PlayerController, puesto que en este mismo script activamos ciertas
animaciones o comportamientos del personaje, como activar una animación
concreta al consumir un objeto.
En cuanto a los métodos, tenemos Start y Update, que son propios de
Unity [5] y nos sirven para la inicialización de variables y ejecuciones cada
frame, respectivamente. También tenemos métodos que son usados en
ItemEffect, para restaurar salud o aumentar el ataque o la defensa
temporalmente, además de una función que calcula el daño recibido por un
enemigo al contactar con nosotros, y dos más para cuando se nos acaban los
puntos de salud y tenemos que revivir.
Diagrama 3: Clase IG_Player
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 63
6.2.3. Controlador del personaje (PlayerController)
Este script va asignado al personaje en la escena, y nos permite
controlarlo con el teclado o el joystick. Dependiendo de si estamos en la aldea
o en una misión, las acciones que podemos hacer varían, ya que sólo en una
misión podemos ejecutar ataques o consumir objetos.
Tenemos controles para movernos, correr, atacar, agacharnos y
bloquear. Combinando estas acciones podemos atacar de diferentes formas. Si
estamos parados o caminando, podemos hacer un combo de tres ataques con
la espada manteniendo pulsado el botón de atacar, mientras que si vamos
corriendo, haremos un ataque en carrera. Aparte, el bloqueo nos sirve para no
recibir daño de los enemigos, adquiriendo una posición defensiva que no nos
permite movernos ni atacar.
Como detalle, el control es relativo a la cámara por lo que es bastante
intuitivo. Además, la cámara está configurada para seguir al personaje.
En cuanto a las animaciones, cada acción lleva asociado un estado, que
es el que se activará en el animador.
Ilustración 41: Máquina de estado para el personaje
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 64
6.2.4. Personalización del personaje (CharacterCustomization)
Este script se encarga de personalizar el personaje acorde al equipo que
llevemos, es decir, que cambie nuestra apariencia según cambiemos de
armadura, arma o escudo.
Esto se hace mediante dos funciones que recopilan los atributos de
apariencia de cada una de las partes del equipo y las asigna al modelo del
personaje. Estos atributos son:
Clase Armor: atributo material (tipo Material).
Clase Weapon: atributo material (tipo Material).
Clase WeaponCoat: atributo effectColor (tipo Color).
Clase Shield: atributo material (tipo Material).
Para hacer estos cambios tenemos la función UpdateMaterial, a la que
llamamos cuando cambiamos alguna parte del equipo en el menú de la casa.
Ilustración 42: Personalización del personaje
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 65
6.3. Sistema de habilidades
El sistema de habilidades se basa en el uso de una clase abstracta,
cuyos métodos deberán implementar cada una de las subclases. Estos
métodos sirven para activar la habilidad, desactivarla, mostrar sus datos en un
string y, por último, para mostrar los niveles de cada habilidad.
Cada subclase representa una habilidad distinta:
AttackBoostSkill: Aumento de ataque permanente, esto es,
multiplicamos por un cierto valor el ataque de nuestro arma.
DefenseBoostSkill: Aumento de defensa permanente, es decir,
multiplicando nuestra defensa base (armadura + escudo) por un
coeficiente.
MorePSSkill: Aumento del número máximo de Puntos de Salud.
MoreItems4RewardSkill: Con esta habilidad obtenemos más objetos
como recompensa de las misiones.
MoreMoney4RewardSkill: Con esta habilidad ganamos más dinero al
completar una misión.
ElementalAttackBoostSkill: Aumento de ataque elemental permanente.
Diagrama 4: Clase Skill y subclases
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 66
6.4. Inventario y Mochila
El inventario y la mochila nos serán muy útiles a lo largo del juego, ya
que nos permiten guardar nuestros objetos. Ambas clases implementan el
patrón Singleton [8], visto anteriormente, que nos permite acceder a ellas
desde cualquier parte del código. También tienen métodos para listar, guardar
y extraer objetos, así como guardar y cargar desde fichero (ver apdo. 6.11)
6.4.1. Clase Inventory
La clase Inventory nos permite guardar objetos, armas, revestimientos,
armaduras, escudos y emblemas en colecciones diferentes, usando SortedList
(listas ordenadas).
Los atributos *FileName sirven para especificar el nombre de los ficheros
donde guardamos y cargamos los datos.
Por otra parte, como métodos tenemos para guardar, extraer, obtener un
listado o consultar la cantidad de un objeto concreto; así como para guardar,
cargar o vaciar el inventario.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 67
Diagrama 5: Clase Inventory
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 68
6.4.2. Clase Bag
La clase Bag solo nos permite llevar objetos a las misiones, y tiene una
capacidad limitada. Además, a diferencia del inventario, solo podremos llevar
una cantidad máxima de unidades de cada objeto, distinta en cada uno.
Al igual que en el inventario, tenemos métodos para guardar, cargar y
vaciar la mochila, así como listar, guardar o extraer objetos. También tenemos
funciones para enviar o recibir objetos del inventario.
Diagrama 6: Clase Bag
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 69
6.5. Equipamiento
El equipamiento está formado por cinco partes: arma, revestimiento,
armadura, escudo y emblema. De ellas, el revestimiento y el emblema no son
obligatorios, aunque es recomendable usarlos.
Respecto a sus clases, todas tienen en común varios atributos: ID,
nombre, descripción, valor (precio de compraventa) e icono; y como método, el
usado para equipar dicha parte del equipo.
En todos los casos, estas clases estarán relacionadas con otra clase
“colección”, al igual que pasaba en el caso de ItemDatabase (ver apdo. 6.1.3),
que nos permiten obtener objetos por ID o por nombre.
6.5.1. Armas (Weapon)
Para las armas, añadimos los siguientes atributos:
attack: El valor de ataque del arma.
material: Material asociado al arma, que afecta al color y brillo.
Diagrama 7: Clases para las armas
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 70
6.5.2. Revestimiento del arma (WeaponCoat)
En cuanto a los revestimientos del arma, añadimos los atributos:
element: Elemento que posee el revestimiento.
elementAttack: Valor de ataque elemental.
effectColor: Color que tendrá el efecto de movimiento de la espada al
usarse este revestimiento (ver apdo. 5.8.7).
Diagrama 8: Clases para los revestimientos
6.5.3. Armaduras (Armor)
Para las armaduras, tenemos los atributos:
defense: Valor de defensa.
damageRatios: Valores de daño, especificados por un número por cada
tipo de elemento, haciéndonos más resistentes si es menor que 1, y más
vulnerables si es mayor que 1.
skillPoints: Puntos de habilidad, guardados en pares <ID de la habilidad,
Puntos>.
material: Material asignado a la armadura, que define el color, brillo,
textura, etc.
También se añaden métodos para asignar los valores de daño y los
puntos de habilidad, usados después del constructor.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 71
Diagrama 9: Clases para las armaduras
6.5.4. Escudos (Shield)
Respecto a los escudos, comparte atributos con las armaduras, así
como los métodos para asignar valores de daño y puntos de habilidad
Diagrama 10: Clases para los escudos
6.5.5. Emblemas (Emblem)
En cuanto a los emblemas, tan solo añadimos los puntos de habilidad,
que es lo único que aporta este componente del equipo.
Diagrama 11: Clases para los emblemas
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 72
6.6. Sistema de misiones
En este juego las misiones son una de las partes esenciales, por lo que
se ha dedicado mucho esfuerzo en hacer un sistema completo, que permita
crear distintas misiones, de distinto tipo, con sus objetivos respectivos.
6.6.1. Clases Quest (y subclases) y QuestCollection
Estas dos clases forman un módulo similar a otros ya vistos
anteriormente (por ejemplo, Item + ItemDatabase).
Diagrama 12: Clases para las misiones
Por un lado, la clase Quest es abstracta, y reúne los atributos básicos
para definir una misión. Tiene como subclases los tipos concretos de misión, en
este caso, de recolección (FarmQuest) y de combate (CombatQuest).
La clase Quest tiene los siguientes atributos:
id: ID de la misión.
level: Nivel o categoría de la misión.
name: Nombre.
description: Descripción de los objetivos.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 73
reward: Objeto de tipo Reward (ver apdo. 6.6.3) que define tanto los
objetos de recompensa como el dinero recibido.
type: Tipo de misión (Recolección o Combate).
state: Estado de la misión (Bloqueada, Desbloqueada o Completada).
unlocks: Array con los IDs de las misiones que se desbloquean al
completar esta.
unlockShopPack: Conjuntos de objetos y equipo que se desbloquean en
la tienda al superar esta misión (ver apdo. 6.8.1).
Como métodos, tenemos para cambiar el estado o añadir misiones que
se desbloquearán.
Para las subclases, añadimos los siguientes atributos:
itemList: Lista con los objetos que hay que entregar. Se encuentran
repetidos, ya que de aquí se irán sacando a la hora de controlar los
objetivos de la misión de recolección.
itemList_NR: Lista con los objetos sin repetir, que sirve como auxiliar.
enemyList: Lista de enemigos a derrotar. Hay repetidos, ya que de aquí
vamos restando los objetivos de la misión de combate.
enemyList_NR: Lista auxiliar con los enemigos sin repetir.
Para ambas subclases tenemos el constructor correspondiente y un
método para añadir objetos o enemigos como objetivo.
En la clase QuestCollection usamos el patrón Singleton, usado con
anterioridad, e incluyendo métodos para obtener misiones por ID o nombre.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 74
6.6.2. Clase QuestLog
En esta clase llevaremos un control sobre el estado de las misiones,
esto es, saber cuáles hemos completado, cuales tenemos pendientes, y cuales
aún están bloqueadas.
Volvemos a utilizar el patrón Singleton, así como una colección de tipo
Dictionary, en la que guardamos pares <ID de la misión, Estado>. También
tenemos la variable currentQuestID, que cambiará cuando aceptemos una
misión en la aldea, almacenando la ID de ésta. Además, en la variable
anyQuestAccepted tenemos un booleano que nos dice si hay una misión
pendiente, de manera que podremos salir por la puerta de la aldea sólo si
vamos a una misión.
Como métodos, tenemos los siguientes:
QuestWithLevel: Nos devuelve una lista con los IDs de las misiones
desbloqueadas (con estado Completada o Desbloqueada) del nivel que
le pasemos. Se usa en la interfaz del puesto de misiones, a la hora de
escoger nivel y misión.
CompleteQuest: Cambia el estado de la misión a completado y
desbloquea las misiones que lleve asociadas, así como nuevos objetos y
equipo para la tienda si se diera el caso.
SaveQuestLog y Save: Guardan el estado de las misiones en fichero
mediante serialización (ver apdo. 6.11).
LoadQuestLog y Load: Cargan el estado de las misiones desde fichero.
Diagrama 13: Clase QuestLog
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 75
6.6.3. Recompensa de misión (Reward)
Al completar una misión obtendremos tanto objetos como dinero de
recompensa. Estos objetos son definidos en un objeto de tipo Reward.
Diagrama 14: Clase Reward
Los atributos de esta clase son:
minObj: Mínimo número de objetos que podemos obtener.
maxObj: Máximo número de objetos.
itemIDs: Array con las IDs de los diferentes objetos posibles.
itemProbs: Array con la probabilidad (entre 0 y 100) de obtención de
cada objeto de itemIDs.
money: Dinero a recibir como recompensa.
MORE_MONEY_SKILL_BONUS: Valor que varía en función de si
tenemos activa la habilidad MoreMoney4RewardSkill. Es modificado a la
hora de activar dicha habilidad, y afecta al cálculo del dinero de
recompensa.
MORE_ITEMS_SKILL_BONUS: Valor que varía si activamos la
habilidad MoreItems4RewardSkill. Se modifica al activar esta habilidad, y
afecta al cálculo del número de objetos de recompensa.
Además, tenemos como métodos el constructor correspondiente, al que
le pasamos todos los datos, y el encargado de generar la recompensa,
devuelta como un array de int con las IDs de los objetos.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 76
6.6.4. Controladores de misión
Durante una misión necesitamos llevar el control de los objetivos, ya
sean objetos que nos quedan por entregar o enemigos por derrotar. Para ello
tenemos los scripts IG_FarmQuestManager (para misiones de recolección) e
IG_CombatQuestManager (para misiones de combate).
Los atributos de estos scripts son los siguientes:
quest: Misión actual, que se cogerá dinámicamente una vez que
entremos en la misión.
itemsTargetList/enemyTargetList: Colección de tipo Dictionary que
almacena pares <ID del objeto/enemigo, cantidad restante>, de donde
iremos descontando a medida que vayamos progresando en la misión.
itemMaxs/enemyMaxs: Similar al anterior, pero este Dictionary
permanece intacto durante la ejecución, de manera que siempre
podamos consultar los objetivos iniciales.
rewardGUI: Referencia a la interfaz de recompensa, de forma que
podremos activarla desde aquí cuando cumplamos el objetivo.
En cuanto a métodos, tenemos los siguientes:
Start: Obtiene la misión actual de la variable currentQuestID de la clase
QuestLog (ver apdo. 6.6.2), y de ésta obtiene los objetivos para
guardarlos en los Dictionary.
CheckTarget: Comprueba que hayamos cumplido todos los objetivos, en
otras palabras, que itemsTargetList/enemyTargetList esté vacío.
Diagrama 15: Controladores de misión
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 77
DeliverItem/DefeatEnemy: Descuenta un objeto/enemigo de los
objetivos, posteriormente llama a CheckTarget.
FinishQuest: Se usa una vez que CheckTarget nos devuelve verdadero.
Tras ello registramos la misión como ‘Completada’ en QuestLog y
mostramos la pantalla de recompensa.
AbandonQuest: Nos devuelve a la aldea sin acabar la misión, por lo que
la seguiremos teniendo pendiente. Al menos podemos llevarnos los
objetos recolectados.
BackToTown: Este método es llamado desde AbandonQuest, pero está
aparte debido a que es usado desde elementos de la interfaz.
6.7. Enemigos
Para los enemigos, tenemos similitudes con clases anteriores, ya que
tenemos una clase Enemy que define las características del enemigo, y una
clase EnemyCollection que reúne a todos los enemigos del juego.
También tenemos el script EnemyIngame, que se asigna al gameObject
del enemigo y controla sus atributos durante la partida, así como generar los
objetos de recompensa al ser derrotado.
Por último, tenemos el script EnemyReward, asignado a cada uno de los
objetos de recompensa generados, y que nos permite guardar ese ítem en el
inventario al tocarlos.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 78
6.7.1. Enemy y EnemyCollection
Diagrama 16: Clases para los enemigos
La clase Enemy tiene los siguientes atributos:
id: ID del enemigo.
name: Nombre.
attack: Ataque del enemigo, utilizado para calcular el daño que recibimos
de él.
defense: Defensa, utilizada para calcular el daño que le causamos.
healthPoints: Puntos de salud.
damageRatios: Valores de daño elemental, cumplen la misma función
que en el caso de las armaduras y escudos.
numItemsReward: Número de objetos que soltará el enemigo al ser
derrotado.
itemList: Array con los IDs de los posibles objetos de recompensa. Ej:
[0,1,20,21]
probList: Array con la probabilidad en % de cada objeto de itemList. Ej:
[30,30,25,15]
icon: Icono del enemigo, usado en los menús.
En el caso de EnemyCollection, usamos el patrón Singleton [8], y
métodos para obtener enemigos por ID o nombre, así como el tamaño de la
colección.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 79
6.7.2. EnemyInGame
Este script controla los parámetros del enemigo durante la misión,
calculando el daño recibido de nuestros ataques y generando la recompensa al
caer derrotado.
Tiene los siguientes atributos:
en: Objeto de la clase Enemy asociado.
id: ID del enemigo, el cual tenemos que introducir desde el editor de
Unity para obtener en.
playerStats: Referencia al script del jugador, del que obtenemos el
ataque del arma (weaponAtk), ataque elemental (elemAtk) y elemento
(element).
cqManager: Referencia al script IG_CombatQuestManager (ver apdo.
6.6.4) si lo hay, para comprobar objetivos al ser derrotado.
anim: Animator del enemigo, para usar las animaciones de ‘React’ y
‘Die’.
itemPrefab: GameObject del objeto de recompensa, que se creará al
caer derrotado.
items: Referencias a todos los objetos de recompensa generados por
este enemigo.
Diagrama 17: Clase EnemyInGame
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 80
6.7.3. EnemyMovement
Este script es el encargado del movimiento del enemigo, así como de
cambiar las animaciones.
Tenemos como atributos:
character: Referencia al componente
Transform de nuestro personaje, que contiene
la posición, siendo el punto al que se dirigirá el
personaje cuando nos detecte.
anim: Componente Animator del enemigo, que
nos permitirá cambiar las animaciones cuando
camine, ataque, etc.
m: Componente NavMeshAgent, que se usa
para definir por qué zonas del escenario puede moverse el personaje, y
que ayuda mucho a la simplificación del movimiento. Simplemente le
indicamos la posición de nuestro personaje como punto de destino y el
enemigo se dirigirá allí automáticamente.
followCharacter: Booleano que nos indica si el personaje nos ha
detectado, y por lo tanto se dispondrá a atacarnos.
enemySound: Esta clase se usa para emitir sonidos propios del
enemigo, como al detectarnos, atacar, recibir ataque, etc.
También tenemos varios métodos interesantes:
Start: Aquí se inicializan las variables, y se le indica como punto de
destino nuestra posición.
Update: En este método se controla el movimiento, se moverá hacia
nosotros si entramos en su radio de visión y se quedará quieto si no.
Además, si está lo bastante cerca, empezará a atacarnos.
OnTriggerEnter: Función que se ejecuta al entrar en el radio de visión
del enemigo, lo que hará que followCharacter cambie a true.
OnTriggerExit: Cambiará la variable followCharacter a false debido a que
habremos salido del radio de visión del enemigo.
Diagrama 18: Clase EnemyMovement
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 81
6.7.4. EnemyReward
Este script está asignado a cada uno de los objetos de recompensa
generados por el enemigo.
Tiene como atributo item el propio objeto, y como método destacable,
OnTriggerEnter, que controla cuando lo tocamos y lo añade a nuestra mochila.
6.8. Mercancía en la tienda y la forja (ShopAvailableStock y
ForgeAvailableStock)
Estas dos clases definen los objetos o equipo que nos encontraremos en
la tienda y la forja, respectivamente. Ambas usan el ya repetido patrón
Singleton, así como guardado y carga mediante serialización en fichero (ver
apdo. 6.11).
6.8.1. ShopAvailableStock
Para la tienda tendremos varias listas, en las que figuran los IDs de los
ítems que podremos encontrar, de manera que podremos añadir más a medida
que vayamos progresando en el juego. También se definen packs de objetos,
de forma que a la hora de desbloquear objetos solo tendremos que llamar a
una función con el ID de un pack para incluir su contenido en la lista
anteriormente citada.
Diagrama 19: Clase EnemyReward
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 82
Diagrama 20: Clase ShopAvailableStock
Los packs de objetos se almacenan en un array doble. Por ejemplo,
tenemos 4 packs de objetos diferentes, cada uno con objetos distintos, que se
guardarían de la siguiente forma:
Ilustración 43: Ejemplo de instanciación de packs de objetos
Si quisiéramos desbloquear el pack 1, solo tendríamos que llamar a
UnlockItemPack (1), por ejemplo al completar una misión concreta. Por otro
lado, los objetos y equipo presentes en packs con índice cero estarán
disponibles desde el comienzo del juego.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 83
6.8.2. ForgeAvailableStock
Respecto a ForgeAvailableStock, es una de las clases más complejas
del sistema, ya que no solo tenemos que almacenar qué equipo estará
disponible para crear, sino también los materiales y el dinero necesarios para
hacerlo.
Diagrama 21: Clases para la forja
Como vemos, tenemos tres colecciones de tipo Dictionary, una por cada
tipo de equipo que podemos crear, almacenando pares <ID de la instancia,
componente de creación>. Este componente de creación es un objeto de una
clase auxiliar (WeaponCreation, ArmorCreation o ShieldCreation), que define
para un arma/armadura/escudo los objetos y el dinero necesarios, así como
métodos para comprobar si cumplimos dicha condición, y crear el elemento
añadiéndolo al inventario.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 84
Volviendo a la clase principal, posee métodos para listar los elementos
disponibles, así como obtener una lista con los objetos necesarios para crear
un elemento, y la cantidad de dicho objeto y su precio.
Para ver más claro cómo funciona este proceso, veamos el código
reducido de la función InitWeaponCreationDictionary:
Ilustración 44: Ejemplo de instanciación de armas en la forja
En ella, vemos como se generan dos armas para su creación:
El arma con ID = 0 costará 500€, así como la entrega de 10 unidades
del objeto con ID = 2.
El arma con ID = 1 costará 1500€, así como la entrega de 12 unidades
del objeto con ID = 2 y 5 unidades del objeto con ID = 20.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 85
6.9. Elementos de interfaz
Pese a que en las nuevas versiones de Unity el diseño de interfaces se
centra más en el propio editor, aún nos hacen falta scripts para gestionar la
interacción entre elementos, así como para realizar transiciones y animaciones.
6.9.1. Menú principal
Para el menú principal del juego, tenemos varios script con funciones
públicas que serán asignadas a cada uno de los botones mediante el editor de
Unity.
Estos scripts son los siguientes:
MainMenuFunctions: Este script controla la primera pantalla del menú
principal. Activará o desactivará el botón Continuar partida según
encuentre archivos de guardado en el equipo. En el caso de que haya,
proporciona funcionalidad a dicho botón, cargando estos ficheros y
reanudando la partida.
Además, define la función para salir del juego, asociada al botón
Salir, que cierra la aplicación.
NewGame: Este script controla la pantalla de selección de nombre del
personaje, proporcionando funciones a las teclas, tanto a las alfabéticas,
como a las de Enter y Borrar. La tecla Enter asigna el nombre a nuestro
personaje y comienza la partida, después de mostrarnos una
confirmación.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 86
6.9.2. Pantalla de carga
La pantalla de carga entre escenas es un elemento importante dentro de
la interfaz del juego, ya que permite cargar los recursos en segundo plano sin
que el usuario tenga que ver escenas a medio cargar y efectos desagradables.
Esta pantalla contiene dos scripts, LoadingScreen se dedica a la carga
asíncrona de la escena siguiente, y LoadingScreenTips permite mostrar
consejos y trucos del juego para amenizar la espera (ver apdo. 5.9.5).
En el caso de LoadingScreen tenemos los siguientes atributos y
métodos:
sceneToLoadIndex: Variable estática en la
que guardamos el ID de la escena que
vamos a cargar mientras se muestre la
pantalla de carga.
loadingScreenIndex: Aquí definimos el
índice de la escena de la pantalla de carga,
ya que Unity carga las escenas indicando un
índice según el orden que tienen en la
configuración del Editor.
async: Variable en la que se almacena el proceso asíncrono de carga en
segundo plano. De ella podemos obtener el porcentaje de carga y
conocer cuando han terminado de cargarse los recursos.
isLoaded: Booleano que indica si han terminado de cargarse los
recursos de async.
loadingText y loadedText: Son los rótulos que se muestran en la pantalla
mientras se carga la escena y una vez que ha terminado de cargar,
respectivamente.
Diagrama 22: Clase LoadingScreen
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 87
Por otro lado, en LoadingScreenTips tenemos los siguientes atributos y
métodos:
tipPrefabs: Array con todos los posibles consejos que se nos pueden
mostrar.
Método Start: En este método generamos un número aleatorio entre 0 y
el tamaño de tipPrefabs, e instanciamos el consejo que esté en esa
posición.
6.9.3. Notificaciones
Para las notificaciones (ver apdo. 5.9.6), usamos un script bastante
simple, con funciones que pueden ser llamadas en cualquier momento de
manera externa. Este script está asignado a un elemento de interfaz vacío, de
manera que al llamarse a estas funciones este elemento va almacenando
mensajes como si de una pila se tratase.
A este script debemos indicarle desde el Editor de Unity los prefab de
cada tipo de notificación. Estos prefab son elementos de interfaz preparados
para ser instanciados, e incluyen el color de fondo, del texto, un icono
representativo y un sonido.
Diagrama 23: Clase para las
notificaciones
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 88
Tenemos los siguientes tipos de notificación:
message: Notificación estándar, usada en cualquier situación.
error: Se muestra al no tener dinero o materiales en la forja en la tienda,
o en general para cualquier tipo de fallo o advertencia que el jugador
deba saber.
confirm: Mostrada al aceptar una misión, entre otros casos.
trans: Usada al comprar o vender objetos en la tienda.
save y load: Se muestra al guardar o cargar datos.
atkBoost y defBoost: Usada al consumir un objeto de aumento de ataque
o defensa, respectivamente.
restoreHealth: Mostrada al usar un objeto que restaure salud, como una
poción.
6.9.4. Cuadros de diálogo
Durante el juego nos encontraremos con algunos personajes u objetos
con los que podremos interaccionar, dándonos información y consejos. Esto es
posible mediante un sistema de diálogos.
Para ello tenemos el script NpcDialog, que contiene un array con los
mensajes que se nos mostrarán, de manera que de una forma sencilla
añadimos interacción a cualquier objeto o personaje. Aparte, si es un
personaje, emitirá un sonido como saludo y gesticulará a medida que nos vaya
hablando.
Ilustración 45: Diálogo con NPC
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 89
6.10. Controlador de audio (SoundManager)
A la hora de producir sonidos necesitamos tener una fuente de sonido,
llamada AudioSource en Unity, a la que podamos tener acceso para reproducir
cualquier sonido. Esto puede llegar a ser complicado si cada objeto de la
escena que produzca sonido tuviera que tener su propio AudioSource, de
manera que se ha optado por una fuente de sonido global, de manera que
desde cualquier parte del código podamos llamar a este SoundManager
pasándole simplemente el sonido que queremos reproducir.
Este script controla dos fuentes de audio, una principal que se usa para
reproducir efectos de sonido (menús, enemigos, voces, etc.) y otra que se usa
para la música de fondo. La razón de separarlas es el poder variar el volumen
de la música de fondo sin que afecte a la otra fuente de audio.
Como se ve en la imagen, tenemos dos objetos de tipo AudioSource, y
varios métodos:
Awake: Es similar a Start(), y se ejecuta nada más entrar en la escena,
buscando los componentes AudioSource y asignándolos a las dos
variables.
Play: Esta función reproduce un sonido en la fuente principal.
SetVolumeBGM: Cambia el volumen de la música de fondo, pasándole
un parámetro entre 0 y 1.
PauseBGM: Pausa la música de fondo.
UnPauseBGM: Reanuda la reproducción de la música de fondo.
Diagrama 24: Clase SoundManager
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 90
6.11. Guardado y carga de datos
En muchas de las clases vistas más arriba se han usado métodos para
guardar y cargar los datos. Esto es posible mediante la serialización de objetos.
Veamos como ejemplo los métodos de guardado y carga de la clase
QuestLog:
En el método de guardado de esta clase guardamos por un lado una
lista con las claves del Dictionary, y en otra los valores, siendo una limitación
de este tipo de guardado el no permitir guardar varias variables en el mismo
fichero. De todas formas son ficheros de poco tamaño, por lo que no debemos
preocuparnos demasiado por esto.
Como vemos, la ruta en la que guarda estos ficheros no es fija, ya que
depende del directorio donde Unity guarda los datos de este juego, variando
entre sistemas operativos. En Windows esta ruta es “C:/Users/(Nombre de
usuario)/AppData/LocalLow/(Nombre del desarrollador)/(Nombre del juego)”.
Ilustración 46: Ejemplo de guardado con serialización
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 91
Ilustración 47: Ejemplo de carga desde fichero
En el método de carga hacemos el proceso contrario, leyendo los datos
del fichero y almacenándolos en las variables.
Por otro lado, se ha utilizado otro método de guardado/carga basado en
PlayerPrefs. Esta clase es propia de Unity, y nos permite almacenar pares
<clave, valor>, pero solo de tipo int, float y string. Este método es mejor si solo
queremos guardar valores simples, por lo que se ha usado para almacenar los
atributos de la clase Player, de la siguiente forma:
Ilustración 48: Ejemplo de guardado mediante PlayerPrefs
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 92
Ilustración 49: Ejemplo de carga mediante PlayerPrefs
Nótese que para guardar las partes del equipo usamos su ID, de manera
que al cargar, equipamos cada una de las partes, calculándose los stats y
habilidades.
Para recopilar todas las llamadas a métodos de guardado y carga de
todas las clases se ha creado la clase SaveLoadSystem, la cual tiene solo dos
funciones:
Ilustración 50: Guardado y carga general de todas las clases
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 93
7. RECURSOS UTILIZADOS
[R1] Animaciones para el personaje y los enemigos, y modelo del enemigo
‘Robot’: [https://www.mixamo.com/]
[R2] Música: [http://incompetech.com/music/royalty-free/]
[R3] Iconos para objetos, armas, etc.: [http://game-icons.net/]
[R4] Fuente para el texto: [http://www.dafont.com/es]
[R5] Modelo del personaje:
[https://www.assetstore.unity3d.com/en/content/42454]
[R6] Pack de animaciones para el personaje:
[https://www.assetstore.unity3d.com/en/content/35320]
[R7] Efectos de sonido para los menús:
[https://www.assetstore.unity3d.com/en/content/27803]
[https://www.assetstore.unity3d.com/en/content/36989]
[R8] Efecto visual del arma:
[https://www.assetstore.unity3d.com/en/content/20972]
[R9] Efecto visual de los objetos obtenidos de los enemigos:
[https://www.assetstore.unity3d.com/en/content/25081]
[R10] Voces de los enemigos:
[https://www.assetstore.unity3d.com/en/content/41754]
[R11] Modelo del enemigo ‘Ogro’:
[https://www.assetstore.unity3d.com/en/content/13541]
[R12] Modelos de árboles y rocas:
[https://www.assetstore.unity3d.com/en/content/22755]
[R13] Modelos de construcciones para la aldea:
[https://www.assetstore.unity3d.com/en/content/27026]
[R14] Modelo de cascada:
[https://www.assetstore.unity3d.com/en/content/19248]
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 94
[R15] Modelos para la zona del templo:
[https://www.assetstore.unity3d.com/en/content/19555]
8. CONCLUSIONES
8.1. Conocimientos aplicados
Durante el desarrollo del proyecto he intentado utilizar la mayor parte de
los conocimientos adquiridos durante el Grado, sobre todo en la parte de
Diseño e Implementación.
Entre estos conocimientos, cabe destacar la técnica de planificación
Scrum, muy útil con sus iteraciones e historias de usuario. También ha sido
muy importante el diseño de clases inicial, ya que me ha facilitado todo el
trabajo de implementación posterior.
Otras técnicas más concretas que destacar son el uso de patrones de
diseño (sobre todo los patrones Singleton y Estrategia) y el uso de colecciones
de objetos, como los Dictionary o las SortedList.
8.2. Dificultades encontradas
Durante el transcurso del proyecto han surgido numerosos problemas,
que de cierta manera han afectado a la planificación inicial propuesta.
El primer obstáculo vino a la hora de implementar el sistema de
misiones, ya que fue más complejo de lo previsto el crear cada tipo de misión.
Por ello, se tuvo que optar por tener solo misiones de recolección y de
combate.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 95
El siguiente inconveniente surgió al crear las interfaces, ya que tardé
más de lo planificado en acabar esta parte, lo que haría resentirse las
iteraciones posteriores.
Otro problema fue la parte de modelado y animación del personaje y los
enemigos, ya que la intención inicial era crearlos yo mismo, no pudiendo
hacerlo al final, debido a la falta de tiempo. Aun así, preferí coger modelos y
animaciones por separado, y hacer yo mismo los controladores y las máquinas
de estados, de manera que se adaptara a lo que yo necesitaba.
Algo similar pasó a la hora de crear los escenarios, tanto de la aldea
como de las misiones, ya que por falta de tiempo tuve que recurrir a assets de
terceros.
En todo lo demás, fue más o menos según lo previsto.
8.3. Resultados obtenidos
En cuanto al resultado final, me quedo bastante satisfecho, ya que he
obtenido una versión estable de un videojuego, objetivo al que pretendía llegar
en un principio.
Los aspectos más positivos que destaco son el sistema de misiones, que
permite añadir nuevas misiones de forma sencilla, así como nuevos tipos.
También resalto los sistemas de tienda y forja, ya que al final he conseguido
aplicarles una interfaz intuitiva y una gran utilidad.
En cuanto a aspectos negativos, destaco el control del personaje, así
como los combates. No he conseguido implementar un control fluido, debido a
la falta de tiempo principalmente. En cuanto a los combates, la inteligencia
artificial de los enemigos es demasiado simple y los ataques muy limitados.
Este sería un campo en el que dedicar bastante tiempo del desarrollo futuro.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 96
9. TRABAJO FUTURO
Los aspectos en los que se podría trabajar a partir de ahora serían los
siguientes:
Más tipos de misiones: Añadir misiones contrarreloj, infinitas, de
exploración, etc.
Enemigos más variados: A partir de los que ya tenemos, añadir más
tipos de enemigos. También mejorar su inteligencia artificial, así como
sus movimientos.
Logros o trofeos: Implementar un sistema de recompensas por acciones
del jugador.
Estadísticas: Almacenar un historial con diferentes aspectos del juego,
como un contador de misiones, de enemigos derrotados, etc.
Añadir nuevos tipos de armas: Para ello habría que incluir nuevos
controladores, así como nuevas animaciones.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 97
10. BIBLIOGRAFÍA
[1] Comparación entre motores gráficos: [http://www.fosfore-studios.com/que-
game-engine-elegir-para-el-desarrollo-de-un-videojuego/]
[2] Lenguajes de programación en Unity: [http://academiaandroid.com/scripts-
lenguajes-programacion-unity/]
[3] Explicación de la metodología SCRUM: [https://proyectosagiles.org/que-es-
scrum/]
[4] Información sobre Pivotal Tracker:
[https://www.adictosaltrabajo.com/tutoriales/pivotal-tracker/]
[5] Explicación de las funciones propias de Unity:
[http://www.hagamosvideojuegos.com/2014/02/unity3d-scripting-
monobehaviour.html]
[6] Documentación sobre la colección Dictionary:
[https://msdn.microsoft.com/en-us/library/xfhwa508.aspx]
[7] Información sobre cómo guardar y cargar partidas usando serialización:
[http://gamedevelopment.tutsplus.com/es/tutorials/how-to-save-and-load-your-
players-progress-in-unity--cms-20934]
[8] Explicación del patrón Singleton: [http://www.gamedev.es/unity3d-patrn-
singleton/]
[9] Explicación del patrón Estrategia: [http://www.dofactory.com/net/strategy-
design-pattern]
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 98
11. Anexo: Manual de usuario
11.1. Menú principal
Puedes escoger entre crear una nueva
partida, continuar una existente,
cambiar algunas opciones o ver los
créditos.
11.2. Pantalla de juego
Guardar los datos:
El juego guarda los datos automáticamente al cambiar de escena.
Indicador de salud: Se
agota al sufrir daños.
Puedes recuperarte usando
pociones y otros objetos
Acceso rápido a objetos:
Puedes usar objetos a la vez
que te mueves.
Oscar Ortiz Cuevas Desarrollo de un Videojuego
Escuela Politécnica Superior de Jaén 99
11.3. Controles
Controles del personaje:
Moverse: Teclas de dirección o stick izquierdo del joystick.
Correr: Tecla Q o botón 8 del joystick.
Atacar: Tecla D o botón 2 del joystick.
Bloquear: Tecla W o botón 1 del joystick.
Acceso rápido a objetos:
Abrir/cerrar el menú: Tecla X o botón 5 del joystick.
Moverse a izquierda/derecha: Teclas Z/C o botones 7/8 del joystick.
Tomar objeto: Tecla A o botón 4 del joystick.
Controles en los menús:
Moverse: Teclas de dirección o cruceta del joystick.
Seleccionar: Tecla S/Enter o botón 3 del joystick.
Pausa: Tecla Escape o botón 10 del joystick.
11.4. Consejos para la aventura
Habla con los aldeanos: Quizás
te den algún consejo que te ayude
en la aventura.
Recommended