2. Backlog
Actividad Semana Esfuerzo
x Definir historia, lluvia de ideas Semana 1 3
x Definir nombre y logo de la empresa Semana 1 2
x Definir nombre y logo del juego Semana 1 2
x Diseño de personajes y escenarios Semana 2 4
x Definir mecánicas e iniciar programación de
enemigos
Semana 2 4
x Ilustraciones de torres Semana 3 3
x Ilustración de efectos Semana 4 3
Ilustración de enemigos Semana 5 3
Ilustración de dragón Semana 5 3
3. Backlog
Actividad Semana Esfuerzo
x Ilustración escenarios Semana 6 2
Animación enemigos Semana 7 3
x Pantallas game over y victoria Semana 8 4
x Movimiento de oleadas Semana 7 4
x Posicionamiento de torres Semana 9 4
x Disparos Semana 9 4
Barra de vida Semana 10 3
x Pantalla de inicio (menú) Semana 7 3
Daño Semana 11 3
Aumento de dificultad Semana 12 4
4. Backlog
Actividad Semana Esfuerzo
Sistema de puntos Semana 12 3
Audio, fx Semana 13 4
Primeras pruebas Semana 14 3
Correcciones finales Semana 15 3
Pruebas finales Semana 17 4
5. Semana 1
-Crear grupo.
-Iniciar backlog.
-Crear nombre del juego y nombre del
estudio.
-Definir algunas mecánicas del juego.
-Lluvia de ideas.
-Contexto y narrativa del juego.
-Concepto y primeros bocetos de los
Personajes (incompleto).
-Boceto de mecánica.
-Búsqueda de Referencias.
12. Contexto
En el reino de Fardia, Drak, un imponente, colosal y temido dragón, ha caído víctima
de una nefasta maldición, y a pesar que esta no sea lo suficientemente poderosa para
acabar con su vida, lo ha dejado debilitado, noticia que se esparce como el fuego
alrededor de todas las comarcas.
Mercenarios, clanes guerreros, cazarrecompensas, caballeros e incluso saqueadores,
todos se preparan para sacar provecho de la vulnerabilidad del dragón, ya sea para
echar mano de su cabeza, o su tesoro.
Ante la inminente llegada de ejércitos enteros, dispuestos a todo para saciar su codicia
humana, el dragón deberá, con ayuda de otras bestias y enemigos de los avariciosos
humanos, proteger su santuario y a si mismo.
13. Escenario
Drak, ahora resguardado en su santuario, dentro de lo más profundo de una cueva en
las montañas de Fardia, se prepara para defenderse de la arremetida humana con toda
la fuerza que aún le queda, para su suerte, múltiples grupos de criaturas de la montaña
se ofrecen a ayudarle.
Resguardado tras sistemas de cuevas construidos por el mismo, deberá planear una
estrategia para resistir la arremetida humana hasta que haya recobrado sus fuerzas.
14. Semana 2
-Narrativa.
-Personajes y sus funciones.
-Empezar bocetos de personajes.
-Cambio de nombre de la empresa y
de nombre de juego.
-Ver vídeos de referencia.
-empezar bocetos de torres.
-empezar oleadas de enemigos.
15. Unidades (Aliadas)
Criaturas, bestias y monstruos de los bosques, acudiendo a la batalla ya sea por la
defensa del dragón, o simplemente por la oportunidad de matar humanos.
16. Torres
Puestos establecidos estratégicamente por el dragón para ubicar grupos de aliados, con
el fin de tener ventaja sobre el atacante. Se dividen en dos categorías, a Distancia y
Cuerpo a Cuerpo.
17. Torres a Distancia
Puestos ubicados para atacar al enemigo desde lejos, ubicados principalmente para dar
apoyo a las torres cuerpo a cuerpo.
Se tendrá a disposición de dos torres de este tipo: Duendes y Ogros
18. Duendes
Criaturas débiles en general, pero maestros de la arquería, por sí solos no representan
una amenaza real para sus adversarios, pero son rápidos, y pueden ayudar
enormemente a frenar enemigos ágiles, a su vez que apoyar a las tropas cuerpo a
cuerpo.
Pros: Alta Precisión, Disparos Rápidos, Sangrado en enemigos.
Contras: Daño Bajo, Débil ante grupos grandes de enemigos.
19. Ogros
Criaturas grandes y fuertes, pueden lanzar proyectiles grandes contra sus enemigos,
desde rocas gigantes hasta bolas de fuego, son imprecisos a la hora de lanzar, por lo
que son más adecuados para enfrentar a grupos grandes de enemigos.
Pros: Daño de área, capaz de dañar múltiples enemigos.
Contras: Poca Precisión, Velocidad de lanzamiento lenta..
20. Torres Cuerpo a Cuerpo
Unidades de choque que se enfrentaran al enemigo cara a cara, con el propósito de
frenar su avance.
Unidad Principal: Nigromante: Conjurador y practicante de las artes oscuras, capaz de
invocar múltiples aliados en el combate.
Las unidades de cuerpo a cuerpo disponibles son, el Espíritu Oscuro, el Esqueleto, y el
Defensor Despertado.
21. Espíritu Oscuro
Alma estancada en el reino de los mortales, proveída una forma física con la que puede
dañar y ser dañada. La débil estructura de su cuerpo le hace vulnerable si es atacado
directamente.
Pros: Fácil y rápida obtención, abundante.
Contras: Daño y Salud Mediocres.
22. Esqueleto
Restos de seres humanos consumidos, reanimados mediante magia, frágiles ante
ataques físicos, pero luchadores natos, pueden encargarse de detener e incluso acabar
con adversarios por si mismos.
Pros: Daño Excelente.
Contras: Salud Baja.
23. Defensor Despertado
Restos zombificados de guerreros ancestrales, caídos dentro de la cueva, y
pertenecientes a una legión ya olvidada. Incapaces de causar mucho daño, pero
increíblemente resistentes a ataques físicos, pueden contener a grupos de enemigos
durante luchas prolongadas, sin embargo, necesitarán la ayuda de otras unidades para
poder derrotarlos.
Pros: Salud Excelente, puede frenar múltiples enemigos.
Contras: Daño Mediocre, escasos.
24. Unidades (Enemigas)
Humanos invadiendo la guarida de Drak, su codicia y sed de sangre les impulsa a
través de las adversidades.
Entre ellos podemos encontrar: Campesinos, Caballeros, Sacerdotes, Piqueros,
Saqueadores, Ladrones, y el rival definitivo del dragón, el Héroe.
25. Campesino
Trabajador de la tierra y los cultivos, obligado por un rey lejano a participar en el
asalto a la cueva del dragón, no poseen ninguna ventaja a parte de su numerosa
cantidad.
Pros: Cantidad.
Contras: Salud, Daño y Velocidad mediocres.
26. Caballero
Guerrero miembro de un ejército humano, enviado por el rey a dar caza al dragón, a
pesar de ser más rápidos y fuertes que los campesinos, no poseen otras habilidades
destacadas.
Pros: Armadura (Alta resistencia contra ataques a distancia).
Contras: Salud mediocre, Daño y Velocidad promedio.
27. Sacerdote
Miembro de un grupo que sigue las enseñanzas de su profeta, enviado a dar apoyo a
aquellos que le están dando caza al demonio alado.
Pros: Curar Unidades Cercanas y a sí mismo.
Contras: Velocidad y Salud promedio, daño mediocre, no puede usar sus poderes
mientras es atacado directamente.
28. Piquero
Rama de los caballeros especializada en la defensa, y en el combate cuerpo a cuerpo,
sin embargo, los asaltos rápidos no son su punto fuerte.
Pros: Extremadamente Peligrosos a corta distancia.
Contras: Velocidad Pésima.
29. Saqueador
Bandido humano atraído al asalto únicamente por el tesoro, guerrero sediento de
sangre, dispuesto a cualquier cosa con tal de conseguir su tesoro.
Pros: INMUNE a ataques a distancia, Salud y daño altos.
Contras: Velocidad baja.
30. Ladrón
Bandido humano en búsqueda de tesoros que robar durante el asalto, ágil como
ningún otro y capaz de evadir a otros guerreros, intentara buscar el momento preciso
para escabullirse entre la batalla.
Pros: INMUNE a ataques cuerpo a cuerpo, velocidad Excelente.
Contras: Salud mediocre, vulnerable a torres básicas debido a su falta de armadura.
31. Héroe
Guerrero anónimo cuyas leyendas le anteceden, no se sabe
mucho de él, más que la muerte lo acompaña a donde vaya. No
desperdiciara su oportunidad de enfrentarse a su oponente más
glorioso hasta ahora.
Pros: Daño y Salud Extremos, capaz de inhabilitar torres,
potencia unidades cercanas, su llegada al santuario causara la
derrota inmediata.
Contras: Velocidad baja.
32. Semana 3
- Definir caminos, aún sin digitalizar.
- Definir torres, ya digitalizadas.
- Avances en la programación respecto a las oleadas y el shooting.
-Primeros bocetos de cómo irían los caminos.
-Mejoras de torres.
-Intentar oleadas.
34. Semana 4
-Animaciones de explosiones.
-Programación de la torre, aun sin funcionar bien.
- Pruebas de programación en torres y enemigos.
- Estudio del sistema de oleadas.
- Programación del movimiento de unidades mediante waypoints.
38. Semana 6
-Código de Bullet.
- Código de Bullet Spawner.
- Código de movimiento de enemigos. (en progreso)
- Código de torre (Spawn de proyectiles)
-menú
40. Semana 7
-código y correcciones.
-reciclar las unidades para que no crearan una sobrecarga en la memoria.
-Código de salud (para daño de personajes)
55. public class Enemigo: MonoBehaviour
{
public float velocidad;
private Waypoints wpoints; // Permite asignarle los Waypoints respectivos del camino a recorrer.
private Vector3 posicion_inicial; // Guarda su posición de inicio.
private int contador; // Necesario para el funcionamiento del movimiento.
void Start()
{
posicion_inicial = this.transform.position; // Establece la posición actual.
wpoints = GameObject.FindGameObjectWithTag("Waypoints").GetComponent<Waypoints>(); //Detecta todos los Waypoints que
pertenecen a una ruta.
}
56. void Update()
{
transform.position = Vector3.MoveTowards(transform.position, wpoints.waypoints[contador].position, velocidad * Time.deltaTime); //
Le da movimiento a la unidad a través del camino.
if(Vector3.Distance(transform.position, wpoints.waypoints[contador].position) < 0.1f)
{
contador++; //Cuando se encuentra extremadamente cerca de su objetivo, el contador aumenta, haciendo que cambie su rumbo al
próximo waypoint.
}
if (GameObject.FindGameObjectsWithTag("WP1").Length == contador)
{
contador = 0;
this.transform.position = posicion_inicial ; //Regresa a la unidad a su posición de inicio y reinicia su contador.
}
//test muerte
if (GetComponent<Salud>().salud < 0) { velocidad = 0; } // Inmoviliza a la unidad, será reemplazado en el futuro por una animación
de muerte.
//fin de test muerte
}
void OnTriggerEnter(Collider otro)
{
if (otro.gameObject.tag == "Bala")
{
Destroy(otro.gameObject); // Destruye las balas cuando es impactado por ellas.
}
}
}
58. public class Bala : MonoBehaviour
{
private GameObject objetivo; // El objeto al que la bala se dirigira, asignado por la torre.
private float velocidad = 5; // La rapidez de la bala.
void Update()
{
Vector3 direccion; // Le indica la dirección de su objetivo.
if (objetivo != null) // Mantiene la bala activa mientras su objetivo lo esté.
{
direccion = objetivo.transform.position - this.transform.position; // Mueve la bala hacia su objetivo.
this.transform.position += velocidad * direccion * Time.deltaTime; // Maneja la velocidad de la bala.
}
}
public void ActivarBala(Torre torre)
{
objetivo = torre.Enemigo; // Usado por la torre para asignar un objetivo a la bala.
}
}
60. public class PoolingEnemigos : MonoBehaviour
{
public static ArrayList unidades = new ArrayList(); // Arreglo de enemigos
void Start()
{
GameObject unidad = GameObject.Find("Test Enemigo"); //Busca el enemigo a asignar.
GameObject temp; // Guarda la unidad que permitirá la aparición de las demás.
Vector3 incremento = new Vector3(-2, 0); // Establece la distancia a la que cada copia aparecerá.
Vector3 posicion_actual = unidad.transform.position; // Guarda la posición del original.
for(int i = 0; i < 10; i++) // Establece i como la cantidad de enemigos a aparecer.
{
temp = (GameObject)Instantiate(unidad,posicion_actual + incremento,Quaternion.identity); // Hace aparecer a las copias del
enemigo.
posicion_actual = temp.transform.position; // Actualiza la posición de la última copia generada.
unidades.Add(temp); // Agrega las unidades creadas al arreglo.
}
}
}
62. public class Waypoints : MonoBehaviour
{
public Transform[] waypoints; // Funciona como un array que permite modificar las rutas fácilmente desde el editor.
}
64. public class Torre : MonoBehaviour
{
private GameObject enemigo; // Guarda el objetivo actual de la torre.
private bool esta_activa; // Maneja el estado de la torre.
private float distancia_umbral = 10f; // Es la distancia a la que un enemigo debe estar para que la torre se active.
public float retraso_disparo = 0f; // Usado para controlar la cadencia de disparo de la torre.
void Update()
{
retraso_disparo -= Time.deltaTime; // Reduce el contador para permitir un próximo disparo.
Enemigo = BuscarEnemigoCercano();
if (Enemigo != null && retraso_disparo <= 0)
{
Disparar(); // Sólo dispara si hay enemigos en su rango y si el enfriamiento de su último disparo ha pasado.
}
}
void Disparar()
{
GameObject obj = (GameObject)Instantiate(GameObject.Find("Bala"), this.transform.position, Quaternion.identity); // Permite acceso
al Prefab de Bala del editor.
Bala bala = obj.GetComponent<Bala>(); //Da acceso al código de la bala.
bala.ActivarBala(this); // Activa la bala.
retraso_disparo = 0.3f; //Reactiva el contador, causando un tiempo de espera para el próximo disparo.
}
65. GameObject BuscarEnemigoCercano()
{
ArrayList enemigos = PoolingEnemigos.unidades; // Detecta al grupo de enemigos, se sospecha genera problemas para detectar al
primero y al ultimo.
GameObject temp; // Crea un espacio temporal para guardar el objetivo.
foreach (object item in enemigos)
{
temp = (GameObject)item; // Rastrea específicamente los enemigos pertenecientes al arreglo, probablemente cree inconvenientes
al agregar mas variantes de enemigo.
if (Vector3.Distance(temp.transform.position, this.transform.position) < distancia_umbral && temp.GetComponent<Salud>().salud >
0)
{
return temp; // Detecta al enemigo en el rango de la torre, y evita detectar enemigos que ya hayan sido derrotados.
}
}
return null; // Si no encuentra enemigos, no regresará nada, haciendo que la torre tampoco haga nada.
}
public GameObject Enemigo
{
get => enemigo; set => enemigo = value;
}
public bool Esta_activa
{
get => esta_activa; set => esta_activa = value;
}
}
67. public class Salud : MonoBehaviour
{
public int salud = 20; // Establece la salud de la unidad.
public float retraso_muerte = 5f; // Genera un retraso antes de la desaparición de la unidad, actualmente sin ser usado, será
reemplazado por la animación de muerte.
void OnTriggerEnter(Collider collider)
{
if (collider.gameObject.CompareTag("Bala"))
{
salud -= 2; // Reduce la vida de la unidad al ser impactado por una bala.
}
}
void Update()
{
if (salud <= 0)
{
retraso_muerte -= Time.deltaTime; // Activa el contador de muerte, será empleado por la animación de muerte.
}
if (retraso_muerte <= 0)
{
//Destroy(this.gameObject); Intento de desaparición de las unidades derrotadas, genera errores, desactivado hasta encontrar una
solución o alternativa.
}
}
}