Example #1
0
    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);
    }