void MoveTowardsCenter(Collider[] closeBoids) { float size = 0f; Vector3 avgPosition = Vector3.zero; for (int i = 0; i < closeBoids.Length; i++) // For every close boid { Boid3D boid = closeBoids[i].GetComponent <Boid3D>(); if (boid != this) { avgPosition += boid.GetPosition(); // Calculate average position size++; } } if (size > 0) { avgPosition /= size; Vector3 targetPosition = avgPosition - transform.position; // Get the direction from current position to the average position calculated and normalize it targetPosition = targetPosition.normalized; rb.velocity += targetPosition * (bfactory.GetCohesionFactor() / 10.0f); // Add an amount of } }
void GenerateBoids() { for (int i = 0; i < numberOfBoids; i++) { Boid3D boid = Instantiate(boidPrefab, Vector3.zero, Quaternion.identity).GetComponent <Boid3D>(); // Instantiate a new boid float rpx = Random.Range(-10f, 10f); // position x float rpy = Random.Range(-10f, 10f); // position y float rpz = Random.Range(-10f, 10f); // position z float rvx = Random.Range(-1f, 1f); // direction x float rvy = Random.Range(-1f, 1f); // direction y float rvz = Random.Range(-1f, 1f); // direction z float rs = Random.Range(1f, 4f); // speed boid.Initialize(rs, new Vector3(rpx, rpy, rpz), new Vector3(rvx, rvy, rvz), this); // Set random position and random velocity } }
void MoveWith(Collider[] closeBoids) { float size = 0f; Vector3 avgVelocity = Vector3.zero; for (int i = 0; i < closeBoids.Length; i++) // For every close boid { Boid3D boid = closeBoids[i].GetComponent <Boid3D>(); if (boid != this) { avgVelocity += boid.GetVelocity(); // Calculate average velocity size++; } } if (size > 0) { avgVelocity /= size; rb.velocity += (avgVelocity * (bfactory.GetAlignmentFactor() / 10.0f)); // Add an amount of average velocity calculated to the current velocity } }
void MoveAway(Collider[] closeBoids) { float theta = Mathf.Deg2Rad * 45f; float cs = Mathf.Cos(theta); float sn = Mathf.Sin(theta); for (int i = 0; i < closeBoids.Length; i++) { Boid3D boid = closeBoids[i].GetComponent <Boid3D>(); if (boid != this) { Vector3 targetPosition = transform.position - boid.GetPosition(); targetPosition = targetPosition.normalized; float px = targetPosition.x * cs - targetPosition.y * sn; float py = targetPosition.x * sn + targetPosition.y * cs; Vector3 dir = new Vector3(px, py, 0); rb.velocity += dir * (bfactory.GetSeparationFactor() / 10.0f); } } }