Page 2 of 4
Sprint #4 19/02/2019
Posted: Tue Feb 19, 2019 10:57 pm
by konicky
¿Que hemos hecho?
-Diseño nivel(tiled).
-finalizamos programacion menus.
-Programar interfaz del juego(barras de vida, mapas).
-Programar historia y instrucciones.
-Programar seleccion personajes.
¿Que vamos a hacer?
-Finalizacion del diseño de nivel y personajes.
¿Que problemas hemos tenido?
-Nula comunicación entre los miembros.
-Desorden con los cronogramas planteados.
-problemas con los programas para el diseño de niveles y personajes.
-Retraso en las fechas.
Evidencias:

Sprint #4 22/02/2019
Posted: Fri Feb 22, 2019 9:21 pm
by konicky
¿Que hemos hecho?
-Programación menús.
-Programación interfaz.
-Programación historia.
-Programación selección personajes.
¿Que vamos a hacer?
-Finalizar programación y diseño de mapas.
¿Que problemas hemos tenido?
-Nula comunicación entre los miembros.
-Desorden con los cronogramas planteados.
-problemas con los programas para el diseño de niveles y personajes.
-Retraso en las fechas.
-Todo el trabajo lo estoy haciendo yo.
Evidencias:
Codigo:
Code: Select all
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Unidad : MonoBehaviour
{
public GameObject ruta; // Aqui se pone el game object de ruta, con los puntos que debe seguir la unidad.
private int punto; // Esto me indica en que punto de la ruta se encuentra el jugador.
private float tiempo;
// Se llama cada frame
void Update()
{
if (tiempo > 0.5) // Control de tiempo ejecuta los comandos cada 0.6 unidades de tiempo.
{
if (punto < ruta.transform.childCount) //childcount me va a indicar cuantos puntos(hijos) tiene el gameobject ruta(padre). Es dinamica(cuando se modifique algo en Unity el codigo aun sirve).
{
Debug.Log(ruta.transform.GetChild(punto).transform.position.x+" "+ruta.transform.GetChild(punto).transform.position.y); //this indica la unidad a la que se le asigno el script.
this.transform.position = new Vector3(ruta.transform.GetChild(punto).transform.position.x, ruta.transform.GetChild(punto).transform.position.y, this.transform.position.z); //El objeto con este codigo se mueve entre los puntos.
punto++; //se asigna como objetivo el siguiente punto de la ruta.
}
tiempo = 0; //se reinicia el tiempo(cronometro).
}
else
{
tiempo += Time.deltaTime; //se le suma el tiempo en segundos desde el ultimo fotograma.
}
}
}
SPRINT #5 26/02/2019
Posted: Tue Feb 26, 2019 8:31 pm
by 000359662
¿Que hemos hecho?
-Descargar e Instalar Unity.
-Descargar assets .
-Empezando con los tiles y escenario.
¿Que vamos a hacer?
-Finalizar programación y diseño de mapas.
-Seguir avanzando con los escenarios
-Seguir trabajando en los personajes.
¿Que problemas hemos tenido?
-Desorden con los cronogramas planteados.
-problemas con los programas para el diseño de niveles y personajes.
-Retraso en las fechas.
Evidencias:

Sprint 6
Posted: Tue Mar 05, 2019 10:52 pm
by konicky
Actividades: Bocetos de gráficos, conceptualización de mecánicas y planificación de niveles.
¿Que hemos hecho?
-Programacion nivel y torres.
¿Que vamos a hacer?
-programacion nivel y torres.
¿Que dificultades hemos tenido?
-No hemos podido reunirnos, por lo que nos repartimos las actividades.
-No he podido terminar algunos modelos de personajes.
-Yo estoy haciendo todo.
Evidencias:
Imagenes:
Video:
Codigo:
Code: Select all
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Unidad : MonoBehaviour
{
public GameObject ruta; // Aqui se pone el game object de ruta, con los puntos que debe seguir la unidad.
private int punto; // Esto me indica en que punto de la ruta se encuentra el jugador.
private float tiempo;
private Vector3 siguiente_punto; //posicion siguiente punto donde debe moverse la unidad.
public float velocidad; //velocidad de movimiento.
private float distancia_minima=0.5f;//distancia minima al punto objetivo(desde donde se pone como objetivo el siguiente).
//Se llama cuando se ejecuta el codigo.
void Start()
{
siguiente_punto = ruta.transform.GetChild(0).position; //toma la posicion de la primera instancia(primer punto) hija de el objeto ruta.
}
// Se llama cada frame.
void Update()
{
Vector3 direccion = siguiente_punto - this.transform.position; //Se asigna la direccion del movimiento de la unidad.
this.transform.position += direccion * velocidad * Time.deltaTime;//cada frame se movera en la direccion x con una velocidad que se le asignara.
//cuando se va al siguiente punto.
if (direccion.magnitude <= distancia_minima)
{
if (punto + 1 < ruta.transform.childCount)
{
punto++;
siguiente_punto = ruta.transform.GetChild(punto).position;
Debug.Log("Xsig: " + siguiente_punto.x + "Ysig: " + siguiente_punto.y);
}
else
{
Destroy(gameObject);
}
}
}
}
Code: Select all
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Torre : MonoBehaviour
{
private GameObject enemigo; //guarda la referencia de la unidad enemiga.
public float distancia_deteccion=2;
public Transform punto_disparo;
public float frecuencia_disparo=0.5f;
private float siguiente_disparo;
private bool esta_activa;
public GameObject bullet;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
Enemigo = BuscarEnemigo();
if (Enemigo != null && Time.time>siguiente_disparo)
{
siguiente_disparo = Time.time + frecuencia_disparo;
Disparar();
Debug.DrawLine(this.transform.position, enemigo.transform.position, Color.green);
}
}
void Disparar()
{
GameObject objeto = (GameObject)Instantiate(bullet, punto_disparo.position, Quaternion.identity);
Bala bala = objeto.GetComponent<Bala>();
bala.ActivarBala(this);
}
GameObject BuscarEnemigo()
{
ArrayList enemigos = PoolingUnidad.unidades;
GameObject temp;
foreach(Object item in enemigos)
{
temp = (GameObject)item; //casting explicito de Object a Gameobject.
if (Vector3.Distance(temp.transform.position, this.transform.position) < distancia_deteccion && temp.activeInHierarchy)
{
return temp; //retorno la referencia de ese objeto.
}
}
return null; //esto me indica que no hay enemigos cercanos.
}
public bool Esta_activa { get => esta_activa; set => esta_activa = value; }
public GameObject Enemigo { get => enemigo; set => enemigo = value; }
}
Sprint #7 12/03/2019
Posted: Tue Mar 12, 2019 11:07 pm
by 000359662
Actividades; creación y planificación de escenarios en unity.
¿Que hemos hecho?
-creación de escenarios(unity)
-Programación nivel y torres.
¿Que vamos a hacer?
-programación nivel y torres.
¿Que dificultades hemos tenido?
-No hubo oportunidad de reunirnos.
-No he podido terminar algunos modelos.
-Terminar la programación tanto de niveles como de las torres.
Evidencias:
ESCENARIO TIERRA
ESCENARIO TIERRA Y AGUA

Sprint #8
Posted: Sun Mar 31, 2019 9:02 pm
by konicky
Fecha:31/03/2018
¿Que hemos hecho?
-Finalizacion animacion unidad enemiga.
-Ajustes programacion preentrega.
-Ajustes menus y HUD.
¿Que vamos a hacer?
-Pruebas y mejoras(balance).
-Mejora errores spawn enemigos.
-Poner mas razas jugables.
¿Que dificultades hemos tenido?
-Nuestro grupo nunca se ha reunido.
-Yo estoy haciendo todo.
-Tuve dificultades con la implementacion de los spawn de enemigos y menu (pooling).
Evidencias:
Imagen referencia:
Codigo:
Code: Select all
void Update()
{
if (Input.GetKeyDown(KeyCode.X))
{
Debug.Log("Torre");
seleccion = 0;
}
if (Input.GetKeyDown(KeyCode.Z))
{
Debug.Log("Casa");
seleccion = 1;
}
}
Code: Select all
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PoolingUnidad : MonoBehaviour
{
public static ArrayList unidades = new ArrayList(); //un Array list es similar a un vector(pero no se especifican cuantos componentes se va a tener). Crece dinamicamente. Es estatic para que se cree una sola vez y se acceda directamente desde otros codigos.
public Transform[] puntos_salida;
public float tiempo_oleada=5f;
public GameObject unidad, unidad2;
// Start is called before the first frame update
void Start()
{
StartCoroutine(Pooling(unidad, puntos_salida[0]));
StartCoroutine(Pooling(unidad2, puntos_salida[1]));
}
IEnumerator Pooling( GameObject unidad, Transform posicion_salida)
{
unidades.Add(unidad);
GameObject temp;
Vector3 incremento = new Vector3(5, 0);
Vector3 posicion_actual = posicion_salida.position;
for (int i = 0; i < 5; i++) //crear 3 unidades
{
yield return new WaitForSeconds(tiempo_oleada);
temp = (GameObject)Instantiate(unidad, posicion_actual + incremento, Quaternion.identity); //creo el objeto temporal con la referencia de la unidad.
posicion_actual = temp.transform.position; //le asigno la posicion al objeto.
unidades.Add(temp); //agrego la unidad a la lista.
}
}
// Update is called once per frame
void Update()
{
}
}
Code: Select all
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Bala : MonoBehaviour
{
private GameObject objetivo;
private float velocidad = 5;
private float tiempo_vida = 0.5f;
private float tiempo_actual;
// Start is called before the first frame update
void Start()
{
tiempo_actual = 0;
}
// Update is called once per frame
void Update()
{
Vector3 direccion;
if (objetivo!=null)
{
direccion = objetivo.transform.position - this.transform.position;
this.transform.position += velocidad * direccion * Time.deltaTime;
}
if (tiempo_actual > tiempo_vida)
{
Destroy(gameObject);
}
tiempo_actual += Time.deltaTime;
}
public void ActivarBala(Torre torre)
{
objetivo = torre.Enemigo;
}
}
Code: Select all
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PonerElemento : MonoBehaviour
{
public GameObject[] elementos; //torre que quiero asignar.
public int seleccion;
void OnMouseDown()
{
GameObject temp; //guarda el objeto que voy a instanciar.
Vector3 posicion = this.transform.position; //guarda la posicion a la que di click.
posicion.y = posicion.y + 0.6f; //suba un poquito la torre en y.
temp = Instantiate(elementos[seleccion]); //se crea el objeto torre.
temp.transform.position = posicion; //se le asigna la posicion a la torre creada(lugar donde se dio click).
temp.layer = 5; //aparezca en pantalla.
Destroy(this.gameObject); //destruye la matica en donde se da click.
}
}
Code: Select all
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UIManager : MonoBehaviour
{
public Slider vida_ui;
public int vida_maxima=10;
private int vida_actual;
private Unidad unidad; //guarda clase Unidad(bajar vidas jugador).
// Start is called before the first frame update
void Start()
{
vida_actual = vida_maxima;
vida_ui.maxValue = vida_actual;
vida_ui.value = vida_ui.maxValue;
}
// Update is called once per frame
void Update()
{
}
public void ActualizarVida()
{
vida_actual--;
vida_ui.value = vida_actual;
}
}
Code: Select all
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PonerElemento : MonoBehaviour
{
public GameObject[] elementos; //torre que quiero asignar.
public int seleccion;
void Update()
{
if (Input.GetKeyDown(KeyCode.X))
{
Debug.Log("Torre");
seleccion = 0;
}
if (Input.GetKeyDown(KeyCode.Z))
{
Debug.Log("Casa");
seleccion = 1;
}
}
void OnMouseDown()
{
GameObject temp; //guarda el objeto que voy a instanciar.
Vector3 posicion = this.transform.position; //guarda la posicion a la que di click.
posicion.y = posicion.y + 0.6f; //suba un poquito la torre en y.
temp = Instantiate(elementos[seleccion]); //se crea el objeto torre.
temp.transform.position = posicion; //se le asigna la posicion a la torre creada(lugar donde se dio click).
temp.layer = 5; //aparezca en pantalla.
Destroy(this.gameObject); //destruye la matica en donde se da click.
}
}
PREENTREGA JUEGO TOWER DEFENSE
Posted: Tue Apr 02, 2019 9:22 am
by konicky
Sprint #9 05/04/2019
Posted: Fri Apr 05, 2019 7:45 am
by konicky
¿Que hemos hecho?
- Correccion Pooling Balas.
- Correccion Pooling Unidades.
- Correccion Menu Inicial y de seleccion de personaje.
¿Que vamos a hacer?
- Pantalla Game Over.
- Pantalla de victoria.
- Finalizacion Prefabs unidades enemigas.
- Implementacion Heroes enemigos.
¿Que dificultades hemos tenido?
- He tenido problemas con el pooling de las balas y unidades. no me esta dejando reactivar las balas una vez disparadas, ni los enemigos una vez desactivados. He intentado usando Listas, Queue y diccionarios y no me ha funcionado.
Evidencias:
Referencias:
https://unity3d.com/es/learn/tutorials/ ... ct-pooling
https://docs.microsoft.com/es-es/dotnet ... ions.queue
https://docs.microsoft.com/en-us/dotnet ... ctionary-2
Video con el error que me aparece:
Codigo Pooling Balas(error):
Code: Select all
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PoolBalas : MonoBehaviour
{
public static Dictionary<int, Queue<GameObject>> pool = new Dictionary<int, Queue<GameObject>>(); //se crea un diccionario que guarde la lista tipo Queue.
public void PreInstancia(GameObject obj, int cantidad)
{
pool.Add(obj.GetInstanceID(), new Queue<GameObject>());
//Instanciar balas
for(int i = 0; i < cantidad; i++)
{
GameObject temp = (GameObject)Instantiate(obj);
pool[obj.GetInstanceID()].Enqueue(temp); //agrega el objeto temp al final de la cola.
temp.SetActive(false);
}
}
public void ReutilizarBalas(GameObject objeto, Transform posicion)
{
if (pool.ContainsKey(objeto.GetInstanceID())) //si existe la llave del diccionario se ejecuta.
{
GameObject temp=pool[objeto.GetInstanceID()].Dequeue(); //accede al primer elemento de la cola.
temp.transform.position = posicion.position; //le indico la posicion en donde se debe instanciar.
temp.SetActive(true);
Debug.Log("Reutilizar");
pool[objeto.GetInstanceID()].Enqueue(temp); //vuelve a agregar a temp al inicio de la lista.
}
}
}
Codigo Torre:
Code: Select all
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Torre : MonoBehaviour
{
private GameObject enemigo; //guarda la referencia de la unidad enemiga.
public float distancia_deteccion=2;
public Transform punto_disparo;
public float frecuencia_disparo=1;
private float siguiente_disparo;
private bool esta_activa;
public GameObject bullet; //guarda el prefab de la bala.
public static Dictionary<int, Queue<GameObject>> pool = new Dictionary<int, Queue<GameObject>>(); //se crea un diccionario que guarde la lista tipo Queue.
// Start is called before the first frame update
void Start()
{
PreInstancia(bullet,10);
}
// Update is called once per frame
void Update()
{
Enemigo = BuscarEnemigo();
if (Enemigo != null && Time.time>siguiente_disparo)
{
siguiente_disparo = Time.time + frecuencia_disparo;
Disparar();
Debug.DrawLine(this.transform.position, enemigo.transform.position, Color.green);
}
}
void Disparar()
{
ReutilizarBalas(bullet,punto_disparo);
}
public void PreInstancia(GameObject obj, int cantidad)
{
pool.Add(obj.GetInstanceID(), new Queue<GameObject>());
//Instanciar balas
for (int i = 0; i < cantidad; i++)
{
GameObject temp = (GameObject)Instantiate(obj);
pool[obj.GetInstanceID()].Enqueue(temp); //agrega el objeto temp al final de la cola.
temp.SetActive(false);
}
}
public void ReutilizarBalas(GameObject objeto, Transform posicion)
{
if (pool.ContainsKey(objeto.GetInstanceID())) //si existe la llave del diccionario se ejecuta.
{
GameObject temp = pool[objeto.GetInstanceID()].Dequeue(); //accede al primer elemento de la cola.
temp.transform.position = posicion.position;//le indico la posicion en donde se debe instanciar.
Bala bala = temp.GetComponent<Bala>(); //creo la instancia de Bala.
bala.ActivarBala(this);
temp.SetActive(true);
//temp.SendMessage("Reinstanciar", SendMessageOptions.DontRequireReceiver);
pool[objeto.GetInstanceID()].Enqueue(temp); //vuelve a agregar a temp al inicio de la lista.
}
}
GameObject BuscarEnemigo()
{
ArrayList enemigos = PoolingUnidad.unidades;
GameObject temp;
foreach(Object item in enemigos)
{
temp = (GameObject)item; //casting explicito de Object a Gameobject.
if (Vector3.Distance(temp.transform.position, this.transform.position) < distancia_deteccion && temp.activeInHierarchy)
{
return temp; //retorno la referencia de ese objeto.
}
}
return null; //esto me indica que no hay enemigos cercanos.
}
public bool Esta_activa { get => esta_activa; set => esta_activa = value; }
public GameObject Enemigo { get => enemigo; set => enemigo = value; }
}
Re: Stormrage-LosDK
Posted: Fri Apr 05, 2019 10:23 am
by xacarana
Próxima clase, revisamos nuevamente, debe verse el trabajo en equipo y muy importante delegar roles de programación, tales como diagramas de clases, comentarios del código y escritura de ciertas rutinas, usando xtreme programming.
Sprint #10 09/04/2019
Posted: Tue Apr 09, 2019 8:17 am
by konicky
Asignacion tareas semana 10.
Nicolás Barragán:
- Menu seleccion de personajes.
- Prefab unidades enemigas.
Nelson Hancco:
- Implementacion historia(programar).
¿Que hemos hecho?
- Menu seleccion de personajes.
¿Que vamos a hacer?
- Finalizacion pooling Balas.
- Prefab unidades enemigas.
¿Que dificultades hemos tenido?
- Se daño el computador portatil, por lo que se ha retrasado la implementacion de los prefabs y el pooling, también se tiene evidencias que no se ha podido subir (ya que estan en el computador dañado).En el transcurso de la semana se subiran esas evidencias.
- Se ha tenido problemas con el Pooling de las balas, ya que no esta dejando reactivar las balas una vez disparadas. Se ha intentado usando Listas, Queue y diccionarios y no ha funcionado.
- No hemos podido reunirnos fisicamente aunque nos hemos comunicado por mensajes y discord.
Evidencias(parte Nicolas):
- Codigos:
Code: Select all
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class Seleccion : MonoBehaviour {
public Image forajido, orco, terraneo, monstruo; //guarda la imagen de las razas.
public Animator Afor, Aorc, Ater, Amon; //animaciones de el menu.
private Color color_defecto; //color del recuadro.
private int raza_id; //identificar raza seleccionada.
// Use this for initialization
void Start()
{
raza_id = 1; //inicializo en la raza Renegado.
color_defecto = forajido.color;
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Z)) //si se hunde Z.
{
raza_id = 1;
}
if (Input.GetKeyDown(KeyCode.X)) //si se hunde X.
{
raza_id = 2;
}
if (Input.GetKeyDown(KeyCode.C)) //si se hunde C.
{
raza_id = 3;
}
if (Input.GetKeyDown(KeyCode.V)) //si se hunde V.
{
raza_id = 4;
}
if (raza_id == 1)
{
Debug.Log(raza_id);
forajido.color = Color.yellow;
Afor.SetBool("Ataque", true); //anima el ataque del forajido.
orco.color = color_defecto;
Aorc.SetBool("Ataque", false);
terraneo.color = color_defecto;
Ater.SetBool("Ataque", false);
monstruo.color = color_defecto;
Amon.SetBool("Ataque", false);
}
if (raza_id == 2)
{
Debug.Log(raza_id);
orco.color = Color.red;
Aorc.SetBool("Ataque", true); //anima el ataque del orco.
forajido.color = color_defecto;
Afor.SetBool("Ataque", false);
terraneo.color = color_defecto;
Ater.SetBool("Ataque", false);
monstruo.color = color_defecto;
Amon.SetBool("Ataque", false);
}
if (raza_id == 3)
{
Debug.Log(raza_id);
terraneo.color = Color.blue;
Ater.SetBool("Ataque", true); //anima el ataque del terraneo.
orco.color = color_defecto;
Aorc.SetBool("Ataque", false);
forajido.color = color_defecto;
Afor.SetBool("Ataque", false);
monstruo.color = color_defecto;
Amon.SetBool("Ataque", false);
}
if (raza_id == 4)
{
Debug.Log(raza_id);
monstruo.color = Color.magenta;
Amon.SetBool("Ataque", true); //anima el ataque del mnstruo.
orco.color = color_defecto;
Aorc.SetBool("Ataque", false);
terraneo.color = color_defecto;
Ater.SetBool("Ataque", false);
forajido.color = color_defecto;
Afor.SetBool("Ataque", false);
}
if (Input.GetKeyDown(KeyCode.Return)) //si se da enter.
{
Debug.Log("Se escogio la raza: " + raza_id);
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);
}
}
}