public void StartSimulation() { boids = new List <GameObject>(); Vector3 posicion = Vector3.zero; GameObject tmp = null; sc = gameObject.GetComponent <SphereCollider>(); for (int i = 0; i < cantidad; i++) { posicion = new Vector3(transform.position.x + Random.Range(-sc.radius, sc.radius), transform.position.y + Random.Range(-sc.radius, sc.radius), transform.position.z + Random.Range(-sc.radius, sc.radius)); tmp = Instantiate(boidTemplate, posicion, Random.rotation) as GameObject; boids.Add(tmp); boidScript bScript = tmp.GetComponent <boidScript>(); bScript.boids = boids; } }
public void aplicarReglas() { bool repulsion = false; bool repulsionDepredador = false; Vector3 puntoDeMasa = Vector3.zero; Vector3 puntoRepulsion = Vector3.zero; Vector3 direccionPromedio = Vector3.zero; Vector3 puntoRepulsionDepredador = Vector3.zero; int boidsCercanos = 0; if (boids.Count != 0) { direccion = Vector3.forward; foreach (GameObject boid in boids) { float distancia = Vector3.Distance(boid.transform.position, transform.position); float angulo = Vector3.Angle(boid.transform.position, transform.position); if (distancia <= rangoSentidoDepredador) { if (boid.tag.Equals("Player") || boid.tag.Equals("limits")) { repulsionDepredador = true; puntoRepulsionDepredador = puntoRepulsion + (transform.position - boid.transform.position); } } if (distancia <= rangoSentido && !boid.Equals(gameObject)) { if (boid.tag.Equals("boid")) { if (distancia <= rangoSentido) { boidScript boidScript = gameObject.GetComponent <boidScript>(); direccionPromedio = direccion + boidScript.direccion; //puntoDeMasa = puntoDeMasa + boid.transform.position; boidsCercanos++; } } if (distancia <= distanciaCritica) { repulsion = true; puntoRepulsion = puntoRepulsion + (transform.position - boid.transform.position); } else { } } } direccionPromedio = (direccionPromedio / boidsCercanos) - transform.position; puntoDeMasa = (puntoDeMasa / boidsCercanos - transform.position); puntoRepulsion = puntoRepulsion; if (repulsionDepredador) { direccion = puntoRepulsionDepredador; //material.color = Color.red; } else { material.color = Color.white; direccion = direccionPromedio; if (repulsion) { direccion = direccion + puntoRepulsion; } } direccion = direccion - transform.position; direccion = direccion.normalized; if (direccion != Vector3.zero) { Debug.DrawRay(transform.position, puntoRepulsion, Color.blue); transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(direccion), velocidadAngular * Time.deltaTime); } if (repulsionDepredador) { transform.Translate(0, 0, Time.deltaTime * velocidad * 2f); } else { transform.Translate(0, 0, Time.deltaTime * velocidad); } } }