Vector3 weightedAveragePosition <T>(List <T> objects, object2Position <T> obj2Pos, object2Priority <T> obj2Pri)
    {
        if (objects == null || objects.Count == 0 || obj2Pos == null || obj2Pri == null)
        {
            return(Vector3.zero);
        }
        float x     = 0f;
        float y     = 0f;
        float z     = 0f;
        float total = 0f;

        foreach (var obj in objects)
        {
            Vector3 vector   = obj2Pos.Invoke(obj);
            float   priority = obj2Pri.Invoke(obj);
            total += priority;
            x     += vector.x * priority;
            y     += vector.y * priority;
            z     += vector.z * priority;
        }
        x /= total;
        y /= total;
        z /= total;
        return(new Vector3(x, y, z));
    }
 Vector3 weightedAveragePosition <T>(List <T> objects, object2Position <T> obj2Pos)
 {
     return(weightedAveragePosition(objects, obj2Pos, f => 1f));
 }