Пример #1
0
    public void ActualizarDepredador()
    {
        try{
            if (this != null)
            {
                if (tVuelo >= 1f)
                {
                    Destruir();
                }
                if (descansando)
                {
                    tVuelo -= settings.ratioTiempoDescanso * Time.deltaTime;
                    if (tVuelo <= 0.3f)
                    {
                        descansando = false;
                    }
                }
                else
                {
                    if (!RegionManager.DentroDeCubo(this.transform.position, RegionManager.mapaRegiones[region].posicion, RegionManager.mapaRegiones[region].dimensiones))
                    {
                        //Hemos cambiado de region, nos eliminamos de la lista de boids de esa region
                        RegionManager.EliminarDepredadorDeRegion(regionAnterior, this);

                        region             = RegionManager.EncontrarRegionIndices(transform.position, regionesAdyacentes);
                        regionesAdyacentes = RegionManager.RegionesAdyacentes(region);

                        RegionManager.AñadirDepredadorDeRegion(region, this);
                        regionAnterior = region;

                        boidsRegion.Clear();
                    }

                    //Regla de colision con objetos
                    Vector3 col = new Vector3(0, 0, 0);
                    if (Colision())
                    {
                        col = ObstacleRays() * settings.pesoEvitarChoque;
                    }

                    tVuelo += settings.ratioTiempovuelo * Time.deltaTime;
                    var rVuelo = new Vector3(0, 0, 0);
                    rVuelo = Reglasuelo();
                    rA     = (rA) * settings.pesoAtaque;
                    var aceleracion = (rA + col + rVuelo);
                    velocidad += aceleracion;

                    //Actualizamos las nuevas direccion y velocidad
                    speed = velocidad.magnitude;
                    Vector3 auxDir = velocidad / speed;//Nueva direccion porque hemos aumentado la velocidad
                    //Nueva velocidad
                    speed     = Mathf.Clamp(speed, settings.minSpeed, settings.maxSpeed);
                    velocidad = auxDir * speed;
                    direccion = auxDir;

                    transform.forward   = direccion;
                    transform.position += velocidad * Time.deltaTime;

                    if (presaObjetivo != null)
                    {
                        if (Distancia(presaObjetivo.transform.position, this.transform.position) < 0.2f)
                        {
                            presaObjetivo.Destruir();
                        }
                    }
                }
            }
        }
        //Si por algun casual nos salimos del mapa, la region va a ser -1 y va a petar. Reseteamos el boid a al primer cubo del mapa de regiones
        catch (ArgumentOutOfRangeException) {
            print("He petado con gpu, ultima region en la que estaba: " + regionAnterior);
            this.Inicializar(settings, RegionManager.mapaRegiones[0].posicion);
        }
    }
Пример #2
0
    //NOTA: Como es un update independiente, no sirve inicializar valores porque entra en el update antes de que se llame a Inicializar.
    //por eso settings tiene que ser referencia desde el principio
    void Update()
    {
        if (!Spawner.activarGPU)
        {
            try{
                if (tVuelo >= 1f)
                {
                    Destruir();
                }
                if (descansando)
                {
                    tVuelo -= settings.ratioTiempoDescanso * Time.deltaTime;
                    if (tVuelo <= 0.3f)
                    {
                        descansando = false;
                    }
                }
                else
                {
                    //Si cambiamos de region nos eliminamos de la region anterior y nos añadimos a la nueva
                    if (!RegionManager.DentroDeCubo(this.transform.position, RegionManager.mapaRegiones[region].posicion, RegionManager.mapaRegiones[region].dimensiones))
                    {
                        //Hemos cambiado de region, nos eliminamos de la lista de boids de esa region
                        RegionManager.EliminarDepredadorDeRegion(regionAnterior, this);

                        //NOTA: Aqui se deberia de encontrar la region a la que pertenece pero con indice de la region inicial o algo asi.
                        //ahora mismo busca la region de entre las 64 existentes, no es muy eficiente
                        region             = RegionManager.EncontrarRegionIndices(transform.position, regionesAdyacentes);
                        regionesAdyacentes = RegionManager.RegionesAdyacentes(region);

                        RegionManager.AñadirDepredadorDeRegion(region, this);
                        regionAnterior = region;

                        boidsRegion.Clear();
                    }
                    boidsRegion.Clear();

                    tVuelo += settings.ratioTiempovuelo * Time.deltaTime;
                    var rVuelo = new Vector3(0, 0, 0);
                    rVuelo = Reglasuelo();
                    //Percibimos las posibles presas de nuestra region y las adyacentes
                    posiblesPresas = PercibirBoidsRegionDepredador();

                    //Regla de ataque
                    presaObjetivo = PresaMasCercana(posiblesPresas);
                    rA            = new Vector3(0, 0, 0);
                    if (presaObjetivo != null)
                    {
                        rA = ReglaAtaque(presaObjetivo);
                    }

                    //Regla de colision con objetos
                    Vector3 col = new Vector3(0, 0, 0);
                    if (Colision())
                    {
                        col = ObstacleRays() * settings.pesoEvitarChoque;
                    }
                    //print("r1: " + r1 + " r2: " + r2 + " r3: " + r3 + " col: " + col);
                    var aceleracion = (rA + col + rVuelo);
                    velocidad += aceleracion;

                    //Actualizamos las nuevas direccion y velocidad
                    speed = velocidad.magnitude;
                    Vector3 auxDir = velocidad / speed;//Nueva direccion porque hemos aumentado la velocidad
                    //Nueva velocidad
                    speed     = Mathf.Clamp(speed, settings.minSpeed, settings.maxSpeed);
                    velocidad = auxDir * speed;
                    direccion = auxDir;

                    transform.forward   = direccion;
                    transform.position += velocidad * Time.deltaTime;

                    if (presaObjetivo != null)
                    {
                        if (Distancia(presaObjetivo.transform.position, this.transform.position) < 0.2f)
                        {
                            presaObjetivo.Destruir();
                        }
                    }
                }
            }
            catch (ArgumentOutOfRangeException) {
                print("He petado, nos inicializamos a la primera region del mapa");
                this.Inicializar(settings, RegionManager.mapaRegiones[0].posicion);
            }
        }
    }