在Unity中获取多个游戏对象之间的中心点

9
我创建了一个游戏,你可以同时控制多个角色,但他们随时都可能死亡。我的问题是当我想让游戏相机包括所有这些游戏物体时。
我认为一个好的选择是计算场景中游戏物体之间的中心点,并使相机在一定距离内跟随该点。
我已经有了相机代码,但我仍然需要知道如何获取那个中心点或另一种方法来实现它。此外,相机不会沿任何轴(X、Y、Z)线性移动,因为它被放置在等距视图中(游戏是3D的)。
最后一个重要事实是,所有运行在游戏中的游戏物体(活着的)都存储在公共静态列表public static List <GameObject>中,以便随时访问这些游戏物体的组件。此外,如果一个角色(游戏物体)死亡或出生,列表将无问题更新。
我给你留下一个图形示例,其中包含三种不同的情况,黑色点是场景中的角色(游戏物体),红色点是我想找到的中心点(向量)。

enter image description here

此外,我留下了相机代码,以便您测试是否有任何解决方案:
public class Camera_Movement : MonoBehaviour {

    Vector3 newPos;
    public static List<GameObject> playersInGame = new List<GameObject>();

    void Update() {

        // Get Central Vector

        // Replace playersInGame[0].transform.position with central vector
        //newPos = Vector3.Lerp(gameObject.transform.position, "central vector", Time.deltaTime);

        newPos = Vector3.Lerp(gameObject.transform.position, playersInGame[0].transform.position, Time.deltaTime);
        gameObject.transform.position = new Vector3(newPos.x, newPos.y, newPos.z);

    }
}

非常感谢您的提前帮助!
2个回答

13

你需要取 x 的平均值和 y 的平均值。

具体来说,应该这样做:

var totalX = 0f;
var totalY = 0f;
foreach(var player in playersInGame)
{
     totalX += player.transform.position.x;
     totalY += player.transform.position.y;
}
var centerX = totalX / playersInGame.Count;
var centerY = totalY / playersInGame.Count;

如果这个对您有用,请告诉我(目前无法访问Unity),但我在这里准备了一个示例:https://dotnetfiddle.net/jGd99I


2
它完美地运行(添加修改以适应我的代码)。它非常简单,以至于我感到尴尬去问。非常感谢您让我看到了新的东西! - Vicky Vicent
2
@VickyVicent 不错的解决方案,适用于少量对象,但如果有更多的对象集合,根据对象的分布情况可能会得到一个奇怪的中心点。例如,如果您有 20 个聚集在一个区域的对象,然后又有另一个对象相距甚远,那么在这里计算出来的中心点将与离群值对象相差甚远。这只是要记住的一些事情! - Serlite
@Serlite 你说得对。我试过很多次,有些离其他物体远一点的情况下会出现一些奇怪的问题(尽管中心仍然正确),但是由于我已经控制了每个新游戏对象何时出现,所以这不是一个问题。可以在代码中包含的有趣选项是,如果对象超出相机视野范围,则相机可以进行缩放,但您必须同样控制游戏对象。感谢您的评论! - Vicky Vicent
1
通过获取平均值,你无法找到中心点。最好的方法是找到最大x值、最大y值、最小x值和最小y值,然后得到一个矩形的四个角,这样你就可以计算出中心点。 - TornadoHell

7
为了拥有一个解决方案,使您的摄像机可以最佳位置以看到所有物体,请尝试以下操作:
public Vector3 FindCenterOfTransforms(List<Transform> transforms)
{
    var bound = new Bounds(transforms[0].position, Vector3.zero);
    for(int i = 1; i < transforms.Count; i++)
    {
        bound.Encapsulate(transforms[i].position);
    }
    return bound.center;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接