void Update() { for (var i = 0; i < NumBoids; i++) { _boidSwarm[i].velocity = _boids[i].Direction * Boid.Speed; _boids[i].Position = _boidSwarm[i].position; _boidSwarm[i].transform.LookAt(_boids[i].Position + _boids[i].Direction); for (var k = 0; k < NumBoids; k++) { //Cycle through all boids, if x y and z values of the boids are within the index i boid's radius, add them to an array, //then get the average heading of all of them, apply that heading to the current boid if (k == i) { continue; } if (((_boids[k].Position.x - _boids[i].Position.x) * (_boids[k].Position.x - _boids[i].Position.x)) + ((_boids[k].Position.y - _boids[i].Position.y) * (_boids[k].Position.y - _boids[i].Position.y)) + ((_boids[k].Position.z - _boids[i].Position.z) * (_boids[k].Position.z - _boids[i].Position.z)) < Boid.ViewRadius) //( x-cx ) ^2 + (y-cy) ^2 + (z-cz) ^ 2 < r^2 LIES INSIDE SPHERE { _boids[i].ObservedBoids[k] = _boids[k]; _boids[i].Direction = Boid.AverageHeading(_boids[i].ObservedBoids); } else { _boids[i].Direction = Vector3.forward; _boids[i].Status[k] = 0; } } // print(_boids[i].Direction); _boids[i].ObstacleAvoid(_boids[i].Position, _boids[i].CollisionDirections(), _boidLayer); if (_boids[i].DetectObstacle()) { // _boids[i].Direction = _boids[i].ClearPath(_boids[i].Position, _boidLayer); averageHeading = Vector3.up; } } Debug.DrawLine(new Vector3(0, 0, 0), _boids[0].Position * 1.5f, Color.white); }