private Vector2 obstacle(GameObject[] walls, BirdControl me)
    {
        Vector2 force = Vector2.zero;

        for (int i = 0; i < walls.Length; i++)
        {
            BirdControl.CachedDelta cd = me.WallDistance(i);
            if (cd.dist > genome.Obstacle.Distance)
            {
                continue;
            }
            force += calcForce(-1 * cd.norm, cd.dist, genome.Cohesion);
        }
        return(force);
    }
    private Vector2 cohesion(BirdControl[] birds, BirdControl me)
    {
        Vector2 force = Vector2.zero;

        foreach (BirdControl b in birds)
        {
            if (b.Equals(me) || !b.Moving)
            {
                continue;
            }
            BirdControl.CachedDelta cd = me.GetDistance(b);
            if (cd.dist > genome.Cohesion.Distance)
            {
                continue;
            }
            force += calcForce(cd.norm, cd.dist, genome.Cohesion);
        }
        return(force);
    }
    private Vector2 repulsion(BirdControl[] birds, float[] forces, BirdControl me)
    {
        Vector2 force = Vector2.zero;

        foreach (BirdControl b in birds)
        {
            if (b.Equals(me) || !b.Moving)
            {
                continue;
            }

            BirdControl.CachedDelta cd = me.GetDistance(b);
            if (cd.dist > genome.Repulse.Distance)
            {
                continue;
            }
            force += calcForce(-1 * cd.norm, cd.dist, genome.Repulse);            // * forces[b.Number];
        }
        return(force);
    }
    private Vector2 aligment(BirdControl[] birds, float[] forces, BirdControl me)
    {
        Vector2 force = Vector2.zero;

        foreach (BirdControl b in birds)
        {
            if (b.Equals(me) || !b.Moving)
            {
                continue;
            }

            BirdControl.CachedDelta cd = me.GetDistance(b);
            if (cd.dist > genome.Align.Distance)
            {
                continue;
            }
            float mag = calcForce(cd.norm, cd.dist, genome.Align).magnitude;            // * forces[b.Number];
            force += b.Velocity.normalized * mag;
        }
        return(force);
    }