Page 4 of 4

Sprint 14# 17/05/2019

Posted: Fri May 17, 2019 10:07 am
by konicky
Asignacion de tareas.
Nicolas:
  • Corrección programación e implementacion rutas, unidades enemigas y torres.
  • Corrección Menú inicial.
  • Corrección Drag and Drop para invocar torres y unidades.
¿Que he hecho?
  • Corrección programación e implementacion rutas, unidades enemigas y torres.
¿Que voy a hacer?
  • Corrección Menú inicial.
  • Corrección pooling torres.
¿Que dificultades he tenido?
  • Mi compañero cancelo materia.
Evidencias.
  • Imagenes:
    Image
    Image
    Image
  • Video:
  • Codigos:
    Punto Invocacion:

    Code: Select all

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class PuntoInvocacion : MonoBehaviour
    {
        private GameObject unidad;
    
        private SpriteRenderer rend;
        private Color color_defecto;
    
        void Start()
        {
            rend = GetComponent<SpriteRenderer>();
            color_defecto = rend.color;
        }
    
        void OnMouseDown()
        {
            if (unidad != null)
            {
                Debug.Log("No se puede colocar aqui");
                return;
            }
    
            GameObject unidad_invocar = Invocacion.instancia.ObtenerPrefab();
            unidad= (GameObject) Instantiate(unidad_invocar, transform.position, Quaternion.identity);
            Destroy(gameObject);
        }
    
        void OnMouseEnter()
        {
            rend.color = Color.gray;
        }
    
        void OnMouseExit()
        {
            rend.color = color_defecto;
        }
    
    }
    Invocacion:

    Code: Select all

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Invocacion : MonoBehaviour
    {
    
        public static Invocacion instancia;
        public GameObject prefab_invocar;
        public GameObject prefab_defecto;
    
        void Awake()
        {
            if (instancia != null)
            {
                Debug.LogError("Hay mas de una instancia de BuildManager");
                return;
            }
            instancia = this;
        }
    
        void Start()
        {
            prefab_invocar = prefab_defecto;
        }
    
        public GameObject ObtenerPrefab()
        {
            return prefab_invocar;
        }
    
    }

Sprint #15 21/05/2019

Posted: Tue May 21, 2019 6:33 pm
by konicky
Asignacion de tareas.
Nicolas:
  • Corrección programación e implementacion rutas, unidades enemigas y torres.
  • Corrección Menú inicial.
  • Corrección Drag and Drop para invocar torres y unidades.
¿Que he hecho?
  • Corrección programación e implementacion rutas, unidades enemigas y torres.
¿Que voy a hacer?
  • Corrección Menú inicial.
  • Corrección pooling torres.
¿Que dificultades he tenido?
  • Mi compañero cancelo materia.
Evidencias.
  • Videos:


  • Imagenes:
    Image
    Image
    Image
    Image
    Image
    Image
    Image
    Image
    Image
    Image
    Image
    Image
    Image
  • Codigos:
    • Bala:

      Code: Select all

      using System.Collections;
      using System.Collections.Generic;
      using UnityEngine;
      
      public class Bala : MonoBehaviour
      {
      
          private Transform objetivo;
          public float velocidad;
      
          public void Buscar(Transform _objetivo)
          {
              objetivo = _objetivo;
          }
      
          void Update()
          {
              if (objetivo == null)
              {
                  Destroy(gameObject);
                  return;
              }
      
              Vector3 dir = objetivo.position - transform.position;
              float df = velocidad * Time.deltaTime;
      
              if (dir.magnitude <= df)
              {
                  Golpear();
                  return;
              }
      
              transform.Translate(dir.normalized * df, Space.World);
          }
      
          void Golpear()
          {
              Debug.Log("Golpeaste a:" + objetivo.name);
              Destroy(gameObject);
          }
      
      }
    • Fade in y Fade out:

      Code: Select all

      using System.Collections;
      using System.Collections.Generic;
      using UnityEngine;
      using UnityEngine.UI;
      using UnityEngine.SceneManagement;
      
      public class Desvanecer : MonoBehaviour
      {
          public Image imagen;
          public AnimationCurve curva;
      
          void Start()
          {
              StartCoroutine(FadeIn());
          }
      
          public void Fading(string escena)
          {
              StartCoroutine(FadeOut(escena));
          }
      
          IEnumerator FadeIn()
          {
              float tiempo = 1f;
      
              while (tiempo > 0f)
              {
                  tiempo -= Time.deltaTime;
                  float valor = curva.Evaluate(tiempo);
                  imagen.color = new Color(0f, 0f,0f,valor);
                  yield return 0;
              }
          }
      
          IEnumerator FadeOut(string escena)
          {
              float tiempo = 0f;
      
              while (tiempo < 1f)
              {
                  tiempo += Time.deltaTime;
                  float valor = curva.Evaluate(tiempo);
                  imagen.color = new Color(0f, 0f, 0f, valor);
                  yield return 0;
              }
      
              SceneManager.LoadScene(escena);
          }
      }
    • Main Menu:

      Code: Select all

      using System.Collections;
      using System.Collections.Generic;
      using UnityEngine;
      using UnityEngine.SceneManagement;
      
      public class MainMenu : MonoBehaviour
      {
      
          public string nivel_cargar = "Nivel 1";
          public Desvanecer desvanecer;
      
          void Awake()
          {
              PlayerPrefs.SetInt("nivel_actual", 1);
          }
      
          public void Play()
          {
              Debug.Log("Play");
              desvanecer.Fading(nivel_cargar);
          }
      
          public void Quitar()
          {
              Debug.Log("Quitar");
              Application.Quit();
          }
      
          public void Instrucciones()
          {
              Debug.Log("Instrucciones");
          }
      }
      
    • Unidad:

      Code: Select all

      using System.Collections;
      using System.Collections.Generic;
      using UnityEngine;
      using UnityEngine.UI;
      
      public class Unidad : MonoBehaviour
      { 
      
          [Header("Datos Unidad")]
          public int vida_maxima; // aqui ponemos vida de la unidad.
          public float velocidad; //velocidad de movimiento.
          public float frecuencia_ataque; //la frecuencia con la que la unidad ataca.
          private int vida_actual; //auxiliar que controla la vida de la unidad.
          private float nuevo_ataque; //auxiliar que controla el ataque de la unidad.
      
      
          [Header("UI Unidad")]
          public Image barra_vida; //barra de vida unidad.
          private Animator anim; //controla las transiciones entre animaciones.+
          public GameObject sangre; //efecto de sangrar a recibir daño.
      
          [Header("Datos  Unidad Enemiga")]
          public LayerMask layer_unidad; //identificador de la unidad enemiga.
          public float distancia_minima;
      
      
          // Start is called before the first frame update
          void Start()
          {
              anim = GetComponent<Animator>();
              vida_actual = vida_maxima; //asigno el valor de la vida maxima a la actual.
              nuevo_ataque = 0; //asigno el tiempo de ataque.
          }
      
          // Update is called once per frame
          void Update()
          {
              if (vida_actual <= 0) // Si el hp de la unidad llega a 0,  muere.
                  Morir();
      
              Debug.DrawRay(transform.position, Vector3.left * 0.5f); //Dibuja una linea desde la unidad hacia la izquierda con una longitud de 0.5f.
              RaycastHit2D hit = Physics2D.Raycast(transform.position, Vector3.left, distancia_minima, layer_unidad); //lanza un rayo que colisiona con los collider.
              if (hit.collider != null) //Si esta cerca a la torre:
              {
                  anim.SetBool("Caminando", false);
                  if (nuevo_ataque <=0) //puede volver a atacar.
                  {
                      Debug.Log("Atacar");
                      anim.SetTrigger("Atacar");
                      nuevo_ataque = frecuencia_ataque;
                  }
                  else
                  {
                      nuevo_ataque -= Time.deltaTime;
                  }
              }
              else
              {
                  nuevo_ataque = 0;
                  anim.SetBool("Caminando", true); //la unidad esta caminando(de idle a walk).
                  transform.position -= Vector3.right * velocidad * Time.deltaTime; //movimiento hacia la izquierda.
              }
      
          }
      
          void OnTriggerEnter2D(Collider2D col)
          {
              if (col.CompareTag("FinCamino")) //Llego la unidad a nuestra base.
              {
                  Debug.Log("La unidad {0} ha llegado a su objetivo. " + col.name);
                  EstadosJugador.vida--;
                  Spawn.enemigos_vivos--;
                  Destroy(gameObject);
              }
              if (col.CompareTag("Bala")) //le ha pegado una bala enemiga.
              {
                  RecibirDaño();
              }
          }
          public void RecibirDaño()
          {
              Instantiate(sangre, transform.position, Quaternion.identity);
              vida_actual--;
              barra_vida.fillAmount = vida_actual/(float)vida_maxima; //Valor barra de vida.
              Debug.Log("Recibiste Daño");
          }
          void Morir()
          {
              Spawn.enemigos_vivos--;
              Destroy(gameObject);
          }
      }
      

Entrega Final POO (Codigos)

Posted: Thu May 23, 2019 11:59 pm
by konicky
Codigos:
Arquero:
  • Code: Select all

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class Arquero : MonoBehaviour
    {
        [Header("Datos Unidad")]
        public int vida_maxima; // aqui ponemos vida de la unidad.
        public float velocidad; //velocidad de movimiento.
        public float frecuencia_ataque; //la frecuencia con la que la unidad ataca.
        public int direccion; //direccion en la que camina la unidad.
        private int vida_actual; //auxiliar que controla la vida de la unidad.
        private float nuevo_ataque; //auxiliar que controla el ataque de la unidad.
    
    
        [Header("UI Unidad")]
        public Image barra_vida; //barra de vida unidad.
        private Animator anim; //controla las transiciones entre animaciones.+
        public GameObject sangre; //efecto de sangrar a recibir daño.
    
        [Header("Datos Disparo")]
        public GameObject bala; //prefab bala que dispara en caso de ser arquero.
        public Transform punto_disparo; 
    
        [Header("Datos  Unidad Enemiga")]
        public LayerMask layer_unidad; //identificador de la unidad enemiga.
        public float distancia_minima; //distancia en la que la unidad a
    
    
        // Start is called before the first frame update
        void Start()
        {
            anim = GetComponent<Animator>();
            vida_actual = vida_maxima; //asigno el valor de la vida maxima a la actual.
            nuevo_ataque = 0; //asigno el tiempo de ataque.
        }
    
        // Update is called once per frame
        void Update()
        {
            if (vida_actual <= 0) // Si el hp de la unidad llega a 0,  muere.
                Morir();
    
            Debug.DrawRay(transform.position, Vector3.left * 0.5f); //Dibuja una linea desde la unidad hacia la izquierda con una longitud de 0.5f.
            RaycastHit2D hit = Physics2D.Raycast(transform.position, direccion*Vector3.right, distancia_minima, layer_unidad); //lanza un rayo que colisiona con los collider.
            if (hit.collider != null) //Si esta cerca a la torre:
            {
                anim.SetBool("Caminando", false);
                if (nuevo_ataque <= 0) //puede volver a atacar.
                {
                    Disparar(hit);
                }
                else
                {
                    nuevo_ataque -= Time.deltaTime;
                }
            }
            else
            {
                nuevo_ataque = 0;
                anim.SetBool("Caminando", true); //la unidad esta caminando(de idle a walk).
                transform.position += direccion * Vector3.right * velocidad * Time.deltaTime; //movimiento hacia la izquierda.
            }
    
        }
    
        void Disparar(RaycastHit2D hit)
        {
            Debug.Log("Atacar");
            anim.SetTrigger("Atacar");
            nuevo_ataque = frecuencia_ataque;
            GameObject proyectil = (GameObject)Instantiate(bala, punto_disparo.position, Quaternion.identity);
            Bala pro = proyectil.GetComponent<Bala>();
    
            if (pro != null)
            {
                pro.Buscar(hit.transform);
            }
        }
    
        void OnTriggerEnter2D(Collider2D col)
        {
            if (col.CompareTag("FinCamino")) //Llego la unidad a nuestra base.
            {
                Debug.Log("La unidad {0} ha llegado a su objetivo. " + col.name);
                EstadosJugador.vida--;
                Spawn.enemigos_vivos--;
                Destroy(gameObject);
            }
            if (col.CompareTag("Bala")) //le ha pegado una bala enemiga.
            {
                int daño = col.GetComponent<Bala>().daño; //cantidad de daño de las balas que lanzan las torres.
                RecibirDaño(daño);
            }
            if (col.CompareTag("Proyectil")) //le ha pegado una bala enemiga.
            {
                int daño = col.GetComponent<Bala>().daño; //cantidad de daño de las balas que lanzan las torres.
                RecibirDaño(daño);
            }
        }
        public void RecibirDaño(int daño)
        {
            Instantiate(sangre, transform.position, Quaternion.identity);
            vida_actual -= daño;
            barra_vida.fillAmount = vida_actual / (float)vida_maxima; //Valor barra de vida.
            Debug.Log("Recibiste {0} Daño" + daño);
        }
        void Morir()
        {
            Spawn.enemigos_vivos--;
            Destroy(gameObject);
        }
    }
Bala:
  • Code: Select all

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Bala : MonoBehaviour
    {
    
        [Header("Datos Bala")]
        public float velocidad; //velocidad de movimiento de la bala.
        public int daño; //daño de la bala.
        private Transform objetivo; //la unidad enemiga.
    
        public void Buscar(Transform _objetivo)
        {
            objetivo = _objetivo;
        }
    
        void Update()
        {
            if (objetivo == null)
            {
                Destroy(gameObject);
                return;
            }
    
            Vector3 dir = objetivo.position - transform.position; //direccion del movimiento de la bala.
            float df = velocidad * Time.deltaTime; //magnitud del movimiento de la bala.
    
            if (dir.magnitude <= df)
            {
                Golpear();
                return;
            }
    
            transform.Translate(dir.normalized * df, Space.World); //movimiento de la bala.
        }
    
        void Golpear()
        {
            Debug.Log("Golpeaste a:" + objetivo.name);
            Destroy(gameObject);
        }
    
    }
Casa:
  • Code: Select all

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Casa : MonoBehaviour
    {
    
        public float frecuencia_invocacion;
        public float tiempo_vida;
        public GameObject moneda;
    
        // Start is called before the first frame update
        IEnumerator Start()
        {
            while (EstadosJugador.esta_vivo==true)
            {
                yield return new WaitForSeconds(frecuencia_invocacion);
                GameObject g_o = Instantiate(moneda, transform.position + Vector3.up * Random.Range(0f, 1f) + Vector3.left * Random.Range(-1f, 1f), moneda.transform.rotation) as GameObject;
                Destroy(g_o, tiempo_vida);
            }
        }
    }
    
Cursor Mouse:
  • Code: Select all

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class ControlCursor : MonoBehaviour
    {
    
        private SpriteRenderer rend;
        public Sprite cursor1;
        public Sprite cursor2;
        
    
    
        // Start is called before the first frame update
        void Start()
        {
            Cursor.visible = false;
            rend = GetComponent<SpriteRenderer>();
        }
    
        // Update is called once per frame
        void Update()
        {
    
            Vector2 cursorPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            transform.position = cursorPos;
    
            if (Input.GetMouseButtonDown(0))
            {
                rend.sprite = cursor2;
            }else if (Input.GetMouseButtonUp(0))
            {
                rend.sprite = cursor1;
            }
    
        }
    }
Destruir Efecto:
  • Code: Select all

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class DestruirEfecto : MonoBehaviour
    {
    
        public float tiempo_vida;
    
        // Start is called before the first frame update
        void Start()
        {
            Invoke("Destruirse", tiempo_vida);
        }
    
        void Destruirse()
        {
            Destroy(gameObject);
        }
    }
Fade in y Fade out:
  • Code: Select all

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    using UnityEngine.SceneManagement;
    
    public class Desvanecer : MonoBehaviour
    {
        public Image imagen;
        public AnimationCurve curva;
    
        void Start()
        {
            StartCoroutine(FadeIn());
        }
    
        public void Fading(string escena)
        {
            StartCoroutine(FadeOut(escena));
        }
    
        IEnumerator FadeIn()
        {
            float tiempo = 1f;
    
            while (tiempo > 0f)
            {
                tiempo -= Time.deltaTime;
                float valor = curva.Evaluate(tiempo);
                imagen.color = new Color(0f, 0f,0f,valor);
                yield return 0;
            }
        }
    
        IEnumerator FadeOut(string escena)
        {
            float tiempo = 0f;
    
            while (tiempo < 1f)
            {
                tiempo += Time.deltaTime;
                float valor = curva.Evaluate(tiempo);
                imagen.color = new Color(0f, 0f, 0f, valor);
                yield return 0;
            }
    
            SceneManager.LoadScene(escena);
        }
    }
    
Estados Jugador:
  • Code: Select all

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class EstadosJugador : MonoBehaviour
    {
        float contador;
        public static int monedas;
        public static int vida;
        public static bool esta_vivo;
        public int monedas_iniciales;
        public int vida_maxima;
        public int nivel_desbloquear = 2;
        public float tiempo_maximo;
        public Text cronometro;
        public Text monedas_actuales;
        public Slider vida_ui;
        public GameObject game_over, nivel_completado;
        public Desvanecer desvanecer;
    
    
        // Start is called before the first frame update
        void Start()
        {
            monedas = monedas_iniciales;
            vida = vida_maxima;
            vida_ui.maxValue = vida;
            vida_ui.value = vida_ui.maxValue;
        }
    
        void Awake()
        {
            esta_vivo = true;
            contador = 0f;
            cronometro.text = "Tiempo: " + (int)contador;
            monedas_actuales.text = "$ " + monedas;
        }
    
        void Update()
        {
            contador += Time.deltaTime;
            cronometro.text= "Tiempo: " + (int)contador;
            monedas_actuales.text = "$ " + monedas;
            vida_ui.value = vida;
    
            if (contador >= tiempo_maximo && Spawn.enemigos_vivos==0)
            {
                NivelCompletado();
            }
    
            if (vida<=0)
            {
                GameOver();
            }
        }
    
        void GameOver()
        {
            esta_vivo = false;
            game_over.SetActive(true);
        }
    
        void NivelCompletado()
        {
            esta_vivo = false;
            Debug.Log("Nivel Completado");
            PlayerPrefs.SetInt("nivel_actual", nivel_desbloquear);
            nivel_completado.SetActive(true);
        }
    }
    
Fin Camino:
  • Code: Select all

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class FinCamino : MonoBehaviour
    {
        void OnTriggerEnter2D(Collider2D collision)
        {
            if (collision.CompareTag("Aliado"))
                Destroy(collision.gameObject);
        }
    }
    
Game Over y Completar Nivel:
  • Code: Select all

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.SceneManagement;
    using UnityEngine.UI;
    
    
    public class GameOver : MonoBehaviour
    {
        float contador;
        public Text cuenta_regresiva;
        public string escena_menu = "Main Menu";
        public Desvanecer desvanecer;
    
        // Start is called before the first frame update
        void Awake()
        {
            contador = 25f;
            cuenta_regresiva.text = ""+ (int)contador;
        }
    
        // Update is called once per frame
        void Update()
        {
            if (contador > 0)
            {
                contador -= Time.deltaTime;
                cuenta_regresiva.text = "" + (int)contador;
            }
            else
            {
                Salir();
            }
        }
    
        public void Completar()
        {
            desvanecer.Fading("Seleccion Nivel");
        }
    
        public void Reiniciar()
        {
            desvanecer.Fading(SceneManager.GetActiveScene().name);
        }
    
        public void Salir()
        {
            desvanecer.Fading(escena_menu);
        }
    }
Invocacion:
  • Code: Select all

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Invocacion : MonoBehaviour
    {
    
        public static Invocacion instancia;
        private PlanoUnidad unidad_invocar;
       
    
        void Awake()
        {
            if (instancia != null)
            {
                Debug.LogError("More than one Instance in scene!");
                return;
            }
            instancia = this;
        }
    
        public PlanoUnidad ObtenerUnidad()
        {
            return unidad_invocar;
        }
    
        public void PonerUnidad(PlanoUnidad unidad)
        {
            unidad_invocar = unidad;
        }
    
    }
    
Jefe (hijo unidad):
  • Code: Select all

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Jefe : Unidad
    {
        [Header ("Datos Slash Jefe")]
        public GameObject bala;
        public Transform punto_disparo;
        public float velocidad_disparo, tiempo_disparo;
        public string tag_enemigo;
        public float rango;
        private Transform objetivo;
    
        void Awake()
        {
            InvokeRepeating("BuscarObjetivo", 0f, tiempo_disparo);
        }
    
        void BuscarObjetivo()
        {
            GameObject[] enemigos = GameObject.FindGameObjectsWithTag(tag_enemigo);
            float distancia_minima = Mathf.Infinity;
            GameObject enemigo_cercano = null;
            foreach (GameObject enemigo in enemigos)
            {
                float distancia_enemigo = Vector3.Distance(transform.position, enemigo.transform.position);
                if (distancia_enemigo < distancia_minima)
                {
                    distancia_minima = distancia_enemigo;
                    enemigo_cercano = enemigo;
                }
                if (enemigo_cercano != null && distancia_minima <= rango)
                {
                    objetivo = enemigo_cercano.transform;
                    Disparar();
                }
                else
                {
                    objetivo = null;
                }
            }
        }
    
        void Disparar()
        {
            anim.SetTrigger("Atacar");
            GameObject balago = (GameObject)Instantiate(bala, punto_disparo.position, bala.transform.rotation);
            Bala proyectil = balago.GetComponent<Bala>();
    
            if (proyectil != null)
            {
                proyectil.Buscar(objetivo);
            }
        }
    
    }
    
Main Menu:
  • Code: Select all

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.SceneManagement;
    
    public class MainMenu : MonoBehaviour
    {
    
        public string nivel_cargar = "Nivel 1";
        public Desvanecer desvanecer;
    
        void Awake()
        {
            PlayerPrefs.SetInt("nivel_actual", 1);
        }
    
        public void Play()
        {
            Debug.Log("Play");
            desvanecer.Fading(nivel_cargar);
        }
    
        public void Quitar()
        {
            Debug.Log("Quitar");
            Application.Quit();
        }
    
        public void Instrucciones()
        {
            Debug.Log("Instrucciones");
        }
    }
Monedas:
  • Code: Select all

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Monedas : MonoBehaviour
    {
        void OnMouseDown()
        {
            EstadosJugador.monedas += 50;
            Destroy(gameObject);
        }
    }
    
Plano Unidad:
  • Code: Select all

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    [System.Serializable]
    public class PlanoUnidad
    {
        public GameObject prefab;
        public int costo;
    }
    
Punto Invocacion:
  • Code: Select all

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.EventSystems;
    
    public class PuntoInvocacion : MonoBehaviour
    {
        private GameObject unidad;
    
        private SpriteRenderer rend;
        private Color color_defecto;
    
        Invocacion invocacion;
    
        void Start()
        {
            rend = GetComponent<SpriteRenderer>();
            color_defecto = rend.color;
            invocacion = Invocacion.instancia;
        }
    
        void OnMouseDown()
        {
            if (EventSystem.current.IsPointerOverGameObject())
                return;
    
            if (invocacion.ObtenerUnidad() == null)
                return;
    
            if (unidad != null)
            {
                Debug.Log("No se puede colocar aqui");
                return;
            }
    
            PlanoUnidad unidad_invocar = invocacion.ObtenerUnidad();
            if (EstadosJugador.monedas < unidad_invocar.costo)
            {
                Debug.Log("No tienes suficiente dinero.");
                return;
            }
            EstadosJugador.monedas -= unidad_invocar.costo;
            Debug.Log("monedas restante: " + EstadosJugador.monedas);
            unidad = (GameObject)Instantiate(unidad_invocar.prefab, transform.position, Quaternion.identity);
            Destroy(gameObject);
        }
    
        void OnMouseEnter()
        {
            if (EventSystem.current.IsPointerOverGameObject())
                return;
    
            if (invocacion.ObtenerUnidad() == null)
                return;
            rend.color = Color.gray;
        }
    
        void OnMouseExit()
        {
            rend.color = color_defecto;
        }
    
    }
    
Seleccion Nivel:
  • Code: Select all

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class SeleccionNivel : MonoBehaviour
    {
        public Desvanecer desvanecer;
        public Button[] botones_nivel;
    
        void Start()
        {
            int nivel_actual = PlayerPrefs.GetInt("nivel_actual", 1);
    
            for (int i=0;i<botones_nivel.Length;i++)
            {
                if(i+1>nivel_actual)
                    botones_nivel[i].interactable = false;
            }
        }
    
        public void Seleccion(string nivel_id)
        {
            desvanecer.Fading(nivel_id);
        }
    }
    
Spawn:
  • Code: Select all

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Spawn : MonoBehaviour
    {
    
        public static int enemigos_vivos;
        public GameObject[] unidades;
        public Transform[] puntos_invocacion;
        public int oleada, max_oleadas;
        public float espera_invocacion;
        public float espera_oleadas;
        public float espera_inicial;
        private float cronometro;
    
        void Awake()
        {
            enemigos_vivos = 0;
            cronometro = espera_inicial;
        }
    
        // Update is called once per frame
        void Update()
        {
            if (enemigos_vivos > 0)
                return;
    
            if (EstadosJugador.esta_vivo && cronometro<=0f)
            {
                StartCoroutine(InvocacionOleadas());
                cronometro = espera_oleadas;
                return;
            }
            cronometro -= Time.deltaTime;
        }
    
        IEnumerator InvocacionOleadas()
        {
            for (int i = 0; i < oleada; i++)
            {
                InvocarUnidad();
                yield return new WaitForSeconds(espera_invocacion);
            }
            oleada++;
            if (oleada > max_oleadas)
                oleada = 1;
        }
    
        void InvocarUnidad()
        {
            int id = Random.Range(0, 3);
            Instantiate(unidades[id], puntos_invocacion[id].position, puntos_invocacion[id].rotation);
            enemigos_vivos++;
        }
    
    }
    
Tienda:
  • Code: Select all

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Tienda : MonoBehaviour
    {
    
        public PlanoUnidad torre;
        public PlanoUnidad granja;
        public PlanoUnidad arquero;
        public PlanoUnidad soldado;
    
        Invocacion inv;
    
        void Start()
        {
            inv = Invocacion.instancia;
        }
    
        public void UnidadEstandar()
        {
            Debug.Log("Torre Estandar");
            inv.PonerUnidad(torre);
        }
    
        public void SeleccionGranja()
        {
            Debug.Log("Granja");
            inv.PonerUnidad(granja);
        }
    
        public void SeleccionArquero()
        {
            Debug.Log("Arquero");
            inv.PonerUnidad(arquero);
        }
    
        public void SeleccionSoldado()
        {
            Debug.Log("Soldado");
            inv.PonerUnidad(soldado);
        }
    }
    
Torre:
  • Code: Select all

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Torre : MonoBehaviour
    {
        [Header("Datos Torre")]
        public float rango; //rango en el que la torre empieza a atacar.
        public float velocidad_disparo; //velocidad de disparos.
        public Transform punto_disparo; //punto en el que dispara.
        public GameObject bala; //proyectil que dispara.
        public int vida_maxima; //vida maxima de la torre.
        public GameObject restos; //efecto de "Sangrado" de la torre.
        private int vida_actual; //controlador de la vida de la torre.
        private float cronometro_disparo; //controlador de el tiempo de disparo.
    
        [Header("Informacion Objetivo")]
        public string tag_enemigo = "Enemigo"; //ID del Enemigo.
        private Transform objetivo; //lugar en donde esta el Enemigo.
    
    
        // Start is called before the first frame update
        void Start()
        {
            cronometro_disparo = 0f;
            vida_actual = vida_maxima;
            InvokeRepeating("BuscarObjetivo", 0f, 0.5f);
        }
    
        // Update is called once per frame
        void Update()
        {
            if (vida_actual <= 0)
                Destruirse();
    
            if (objetivo == null)
                return;
    
            if (cronometro_disparo <= 0)
            {
                Disparar();
                cronometro_disparo = 1f / velocidad_disparo;
            }
    
            cronometro_disparo -= Time.deltaTime;
        }
    
        void BuscarObjetivo()
        {
            GameObject[] enemigos = GameObject.FindGameObjectsWithTag(tag_enemigo);
            float distancia_minima = Mathf.Infinity;
            GameObject enemigo_cercano = null;
            foreach(GameObject enemigo in enemigos)
            {
                float distancia_enemigo = Vector3.Distance(transform.position, enemigo.transform.position);
                if (distancia_enemigo < distancia_minima)
                {
                    distancia_minima = distancia_enemigo;
                    enemigo_cercano = enemigo;
                }
                if (enemigo_cercano != null && distancia_minima <= rango)
                {
                    objetivo = enemigo_cercano.transform;
                }
                else
                {
                    objetivo = null;
                }
            }
        }
    
        void Disparar()
        {
            Debug.Log("Disparar");
            GameObject balago= (GameObject)Instantiate(bala, punto_disparo.position, bala.transform.rotation);
            Bala proyectil = balago.GetComponent<Bala>();
    
            if (proyectil != null)
            {
                proyectil.Buscar(objetivo);
            }
        }
    
        void OnDrawGizmosSelected()
        {
            if (objetivo != null)
            {
                Gizmos.color = Color.blue;
                Gizmos.DrawLine(transform.position, objetivo.position);
                Debug.Log("El objetivo es: " + objetivo.name);
            }
        }
    
        void OnTriggerEnter2D(Collider2D col)
        {
            if (col.CompareTag("Proyectil")) //le ha pegado una bala enemiga.
            {
                int daño = col.GetComponent<Bala>().daño; //cantidad de daño de las balas que lanzan las torres.
                RecibirDaño(daño);
            }
        }
    
        public void RecibirDaño(int daño)
        {
            Instantiate(restos, transform.position, Quaternion.identity);
            vida_actual -= daño;
            Debug.Log("Recibiste " + daño+ "daño");
        }
    
        void Destruirse()
        {
            Destroy(gameObject);
        }
    }
    
Unidad:
  • Code: Select all

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class Unidad : MonoBehaviour
    { 
    
        [Header("Datos Unidad")]
        public int vida_maxima; // aqui ponemos vida de la unidad.
        public float velocidad; //velocidad de movimiento.
        public float frecuencia_ataque; //la frecuencia con la que la unidad ataca.
        public int daño; //cantidad de daño que produce el ataque de una unidad.
        public int direccion; //direccion en la que camina la unidad.
        private int vida_actual; //auxiliar que controla la vida de la unidad.
        private float nuevo_ataque; //auxiliar que controla el ataque de la unidad.
    
    
        [Header("UI Unidad")]
        public Image barra_vida; //barra de vida unidad.
        public Animator anim; //controla las transiciones entre animaciones.+
        public GameObject sangre; //efecto de sangrar a recibir daño.
    
        [Header("Datos  Unidad Enemiga")]
        public LayerMask layer_unidad; //identificador de la unidad enemiga.
        public float distancia_minima; //distancia en la que la unidad a
    
        public int Vida_actual { get => vida_actual; set => vida_actual = value; }
    
    
        // Start is called before the first frame update
        void Start()
        {
            anim = GetComponent<Animator>();
            Vida_actual = vida_maxima; //asigno el valor de la vida maxima a la actual.
            nuevo_ataque = 0; //asigno el tiempo de ataque.
        }
    
        // Update is called once per frame
        void Update()
        {
            if (Vida_actual <= 0) // Si el hp de la unidad llega a 0,  muere.
                Morir();
    
            Debug.DrawRay(transform.position, Vector3.left * 0.5f); //Dibuja una linea desde la unidad hacia la izquierda con una longitud de 0.5f.
            RaycastHit2D hit = Physics2D.Raycast(transform.position, direccion*Vector3.right, distancia_minima, layer_unidad); //lanza un rayo que colisiona con los collider.
            if (hit.collider != null) //Si esta cerca a la torre:
            {
                anim.SetBool("Caminando", false);
                if (nuevo_ataque <=0) //puede volver a atacar.
                {
                    Atacar(hit);
                }
                else
                {
                    nuevo_ataque -= Time.deltaTime;
                }
            }
            else
            {
                nuevo_ataque = 0;
                anim.SetBool("Caminando", true); //la unidad esta caminando(de idle a walk).
                transform.position += direccion*Vector3.right * velocidad * Time.deltaTime; //movimiento hacia la izquierda.
            }
    
        }
    
        void Atacar(RaycastHit2D hit)
        {
            Debug.Log("Atacar");
            anim.SetTrigger("Atacar");
            nuevo_ataque = frecuencia_ataque;
            hit.collider.SendMessage("RecibirDaño", daño);
        }
    
        void OnTriggerEnter2D(Collider2D col)
        {
            if (col.CompareTag("FinCamino")) //Llego la unidad a nuestra base.
            {
                Debug.Log("La unidad {0} ha llegado a su objetivo. " + col.name);
                EstadosJugador.vida--;
                Spawn.enemigos_vivos--;
                Destroy(gameObject);
            }
            if (col.CompareTag("Bala")) //le ha pegado una bala enemiga.
            {
                int daño = col.GetComponent<Bala>().daño; //cantidad de daño de las balas que lanzan las torres.
                RecibirDaño(daño);
            }
            if (col.CompareTag("Proyectil")) //le ha pegado una bala enemiga.
            {
                int daño = col.GetComponent<Bala>().daño; //cantidad de daño de las balas que lanzan las torres.
                RecibirDaño(daño);
            }
        }
        public void RecibirDaño(int daño)
        {
            Instantiate(sangre, transform.position, Quaternion.identity);
            Vida_actual-=daño;
            barra_vida.fillAmount = Vida_actual/(float)vida_maxima; //Valor barra de vida.
            Debug.Log("Recibiste {0} Daño"+daño);
        }
        void Morir()
        {
            Spawn.enemigos_vivos--;
            Destroy(gameObject);
        }
    }
    

Entrega Final POO (Exposicion y Gameplays)

Posted: Fri May 24, 2019 7:06 am
by konicky
Stormrage Presentacion:
https://docs.google.com/presentation/d/ ... sp=sharing

Stormrage Gameplays:
Perdiendo el juego:

Ganando el juego:
Parte 1:

Parte 2:

Parte 3:

Parte 4:

Entrega Final POO(Muestra Final)

Posted: Fri May 31, 2019 8:28 pm
by konicky
Stormrage.
Coevaluacion:
  • El evento estuvo bien, aunque podría mejorar la organización, y talvez ubicarnos en un mejor sitio (un salón) en donde facilidad de conexión a la luz( ya que la gente se enredaba con los cables de los cargadores y extensiones).
  • Del juego, todos los usuarios me indicaron que seria mejor que los puntos de invocación no fueran tan limitados, ya que cuando se gastaban, el jugador no podría interactuar mas con el juego y solo se sentaba a esperar si ganaba o perdía. Este cambio poder ser agregar el punto de invocación como objeto de la tienda(que se compre con oro), que aparezca cada x tiempo, pero se destruya después, o que después de la construcción de la unidad o torre apareciera otra vez después de un tiempo.
  • También se puede mejorar la resolución del puntero, ya que la gente tuvo mucha dificultad al manejarlo.
Poster:
  • Image
Diagrama de clase:
  • Image
  • Image
Imagenes muestra:
  • Image
  • Image
  • Image
Gameplay:
Victoria:

Derrota:

Ejecutable del juego: