/// <summary> /// se crea la corutina encargada de medir las distancias entre el heroe y los npcs para y entregar la informacion al usuario /// dentro de la corutina se pregunta primero si los objetos poseen el el tag de zombie o villager /// se define la distanciaA y la distciaB /// las cuales pertenecen a las instacias de citizen y zombie estas son llevadas a cabo cada que finaliza el frame /// luego en los dos condicionales siguientes se calcula la distancia y en base a si esta mas cerca /// o lejos se entrega un texto sin embargo en esta parte solo se de escribe el mensaje pero no se entrega /// esta corutina se ejecuta cada 0.1 segundos /// </summary> /// <returns></returns> IEnumerator BuscaEntidades() { zombies = GameObject.FindGameObjectsWithTag("Zombie"); citizens = GameObject.FindGameObjectsWithTag("Villager"); // Informacion sobre el villager foreach (GameObject item in citizens) { yield return(new WaitForEndOfFrame()); civbody.Citizen componenteAldeano = item.GetComponent <civbody.Citizen>(); if (componenteAldeano != null) { distanciaA = Mathf.Sqrt(Mathf.Pow((item.transform.position.x - transform.position.x), 2) + Mathf.Pow((item.transform.position.y - transform.position.y), 2) + Mathf.Pow((item.transform.position.z - transform.position.z), 2)); if (distanciaA < 5f) { tempus = 0; civinfo = item.GetComponent <civbody.Citizen>().citizenstats; TextVillager.text = "Hola, soy " + civinfo.nombre + " y tengo " + civinfo.edad.ToString() + " años"; } if (tempus > 3) { TextVillager.text = " "; } } } // Informacion sobre el zombie foreach (GameObject itemZ in zombies) { yield return(new WaitForEndOfFrame()); zom.Zombie componenteZombie = itemZ.GetComponent <zom.Zombie>(); if (componenteZombie != null) { distanciaB = Mathf.Sqrt(Mathf.Pow((itemZ.transform.position.x - transform.position.x), 2) + Mathf.Pow((itemZ.transform.position.y - transform.position.y), 2) + Mathf.Pow((itemZ.transform.position.z - transform.position.z), 2)); if (distanciaB < 5f) { tempus = 0; zombieinfo = itemZ.GetComponent <zom.Zombie>().zombiestats; TextZombie.text = "Waaaarrrr quiero comer " + zombieinfo.antojo; } if (tempus > 3) { TextZombie.text = " "; } } } yield return(new WaitForSeconds(0.1f)); StartCoroutine(BuscaEntidades()); }
private void OnCollisionEnter(Collision collision) { if (collision.collider.GetComponent <zombies.Zombies>()) //con esto se pregunta si el objeto con el que collisiono posee el componente zombies el cual accede al namespace npc,especificamente a la clase zombies { zombies.Zombies zombie = collision.collider.GetComponent <zombies.Zombies>(); //se crea una variable la cual se iguala a la colision para almacenarla Debug.Log("Wrrrr soy un Zombie y quiero comer" + " " + zombie.GetZombiestats().partes); //con esto se imprime un mensaje en la consola que lleva tambian las estadisticas del zombie y sus gustos } if (collision.collider.GetComponent <citizen.Citizen>()) // con esto se asegura de preguntar si el objeto con el que colisiona posee el componente citizen el cual accede a la clase citizen contenida en el namespace ally { citizen.Citizen civil = collision.collider.GetComponent <citizen.Citizen>(); //se crea una variable que almacena la colision Debug.Log("Hola soy" + " " + civil.statsciv().nombre + " Tengo " + civil.statsciv().edad + "Años"); //se impirime en la consola un mensaje con los datos del ciudadano que accede a la estructura con los datso del ciudadano } }
/// <summary> /// se crea un coruttina cuya funcion es buscar entre las instancias generadas cuales poseen los tags de heroe o ciudadano /// este a su vez barre las posiciones del array de gameobjects /// y espera hasta el que termine el frame para volver a ejecutar la corrutina /// se crea una varible local referenciada con el script de citizen para acceder al rigidbody de este /// se crean dos variables locales las cuales representan las distancias del citizen y del heroe /// luego se crea un condicional manejado por uno de los booleanos declarados en la clase /// y dentro de ese condicional se gneneran otros dos los cuales calculan las distancias y en base a cual sea mayor o menor se fija un objetivo /// despues dentro de otro condicional se calculan las distancias nuevamente en caso de que ambas sean menores a las del anterior condiconal el objetivo pasa /// a ser el person es decir el ciudadano en caso tal de que ambas distancias sean mayores a las ya citas entonces el booleano encargado de esta funcion sera falso /// la corrutina espera 0.1 segundos para volver a ser ejecutada /// </summary> /// <returns></returns> IEnumerator seekingvictims() { heroe = GameObject.FindGameObjectWithTag("Hero"); Citizens = GameObject.FindGameObjectsWithTag("Citizen"); foreach (GameObject person in Citizens) { yield return(new WaitForEndOfFrame()); zombie.Citizen referenciaciv = person.GetComponent <zombie.Citizen>(); if (referenciaciv != null) { PuntoB = Mathf.Sqrt(Mathf.Pow((heroe.transform.position.x - transform.position.x), 2) + Mathf.Pow((heroe.transform.position.y - transform.position.y), 2) + Mathf.Pow((heroe.transform.position.z - transform.position.z), 2)); PuntoA = Mathf.Sqrt(Mathf.Pow((person.transform.position.x - transform.position.x), 2) + Mathf.Pow((person.transform.position.y - transform.position.y), 2) + Mathf.Pow((person.transform.position.z - transform.position.z), 2)); if (!persigue) { if (PuntoA < 5f) { Zombiestate = State.Pursuing; objetivo = person; persigue = true; } else if (PuntoB < 5f) { Zombiestate = State.Pursuing; objetivo = heroe; persigue = true; } } if (PuntoA < 5f && PuntoB < 5f) { objetivo = person; } } } if (persigue) { if (PuntoA > 5f && PuntoB > 5f) { persigue = false; } } yield return(new WaitForSeconds(0.1f)); StartCoroutine(seekingvictims()); }