/// <summary> /// Función que se encarga de buscar depredadores dado un radio, un ángulo de vista y una capa. /// Si encuentra destina a la presa a un punto en dirección contraria a la del depredador, si no setea su próxima acción a BuscarComida. /// </summary> public void BuscarDepredador() { // Array contenedor de los elementos que chocan con nuestra esfera y estan dentro del layer comidaMask Collider[] depredadoresVisibles = Physics.OverlapSphere(transform.position, radioVision, depredadorMask); if (depredadoresVisibles.Length > 0) { // Bucle que comprueba mediante un RayCast qué enemigos se encuentran visibles para nuestro personaje for (int i = 0; i < depredadoresVisibles.Length; i++) { targetDepredador = depredadoresVisibles[i].transform; // Dirección a la comida encontrada Vector3 dirToTarget = (targetDepredador.position - transform.position).normalized; // Comprobamos que esté dentro de nuestro ángulo de visión if (Vector3.Angle(transform.forward, dirToTarget) < viewAngle) { accionActual = AccionesAnimal.Huir; transform.LookAt(targetDepredador); navMesh.SetDestination(transform.position + (transform.position - targetDepredador.position)); } } } else { accionActual = AccionesAnimal.BuscarComida; } }
/// <summary> /// Función que comprueba si la colisión ha sido con un depredador para en tal caso morir. /// </summary> /// <param name="collision"></param> private void OnCollisionEnter(Collision collision) { if (collision.gameObject.tag == "Depredador") { accionActual = AccionesAnimal.Morir; Depredador depredador = collision.gameObject.GetComponent <Depredador>(); depredador.AddComida(); } }
// Start is called before the first frame update void Start() { navMesh = GetComponent <NavMeshAgent>(); // La velocidad se calcula como un porcentaje de la máxima navMesh.speed = cromosomas[0] * maxVelocidad / 100; radioVision = cromosomas[1] * maxRadioVision / 100; // Primera acción de la presa accionActual = AccionesAnimal.BuscarComida; cambioEscala = new Vector3(-0.005f, -0.005f, -0.005f); }
/// <summary> /// Función que comprueba si la presa puede sobrevivir o debe morir. /// </summary> public void FinalDelDia() { if (plantasComidas > 0) { accionActual = AccionesAnimal.Descansar; } else { accionActual = AccionesAnimal.Morir; } }
/// <summary> /// Función que busca un punto aleatorio dentro de un radio y setea su próxima accion a BuscarDepredador. /// </summary> public void Explorar() { Vector3 randomDirection = UnityEngine.Random.insideUnitSphere * radioVision; NavMeshHit navHit; NavMesh.SamplePosition(randomDirection, out navHit, 3f, -1); navMesh.SetDestination(navHit.position); accionActual = AccionesAnimal.BuscarDepredador; }
// Update is called once per frame void Update() { // Si se han comido 2 plantas puede descansar if (plantasComidas == 2 && accionActual != AccionesAnimal.Huir) { accionActual = AccionesAnimal.BuscarDepredador; } switch (accionActual) { case AccionesAnimal.BuscarDepredador: BuscarDepredador(); break; case AccionesAnimal.BuscarComida: BuscarComida(); break; case AccionesAnimal.Huir: float distancia = Vector3.Distance(transform.position, targetDepredador.position); if (distancia > distanciaMinima) { accionActual = AccionesAnimal.Explorar; } break; case AccionesAnimal.Comiendo: // Se comprueba que la planta no haya sido comida por otro if (!targetComida.gameObject.GetComponent <Collider>().enabled) { accionActual = AccionesAnimal.BuscarComida; } break; case AccionesAnimal.Descansar: Descansar(); break; case AccionesAnimal.Explorar: Explorar(); break; case AccionesAnimal.Morir: Morir(); break; case AccionesAnimal.None: break; } }
// Update is called once per frame void Update() { // Si se han comido 2 plantas puede descansar if (presasComidas == 2) { accionActual = AccionesAnimal.Descansar; } switch (accionActual) { case AccionesAnimal.BuscarComida: BuscarComida(); break; case AccionesAnimal.Comiendo: float distancia = Vector3.Distance(transform.position, targetPresa.position); if (distancia > distanciaMaxima) { accionActual = AccionesAnimal.BuscarComida; } break; case AccionesAnimal.Descansar: Descansar(); break; case AccionesAnimal.Explorar: Explorar(); break; case AccionesAnimal.Morir: Morir(); break; case AccionesAnimal.None: break; } }
/// <summary> /// Función que añade uno al número de plantasComidas y setea su próxima accion a Explorar. /// </summary> public void AddComida() { plantasComidas++; accionActual = AccionesAnimal.Explorar; }