Ejemplo n.º 1
0
    /// <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;
        }
    }
Ejemplo n.º 2
0
    /// <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();
        }
    }
Ejemplo n.º 3
0
    // 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);
    }
Ejemplo n.º 4
0
 /// <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;
     }
 }
Ejemplo n.º 5
0
    /// <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;
    }
Ejemplo n.º 6
0
    // 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;
        }
    }
Ejemplo n.º 8
0
 /// <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;
 }