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); } }
//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); } } }