C# 在Unity中获得多个游戏对象之间的中心点

C# 在Unity中获得多个游戏对象之间的中心点,c#,unity3d,C#,Unity3d,我已经创建了一个游戏,在这个游戏中,你可以在同一时间以相同的形式控制X个角色,他们可以随时死亡。我的问题是当我想让游戏摄像机包含所有这些游戏对象时 我认为一个很好的选择是计算场景中游戏对象之间的中心点,并使相机以一定距离跟随该点。 我已经有了摄像头代码,但我仍然需要知道如何获取中心点或其他方法。此外,相机不会线性地跟随任何轴(X、Y、Z),因为它的放置方式是视图是等距的(游戏是3D的) 最后一个重要事实是,游戏中运行的所有游戏对象(活动的)都存储在公共静态列表中,以便能够随时访问这些游戏对象的组

我已经创建了一个游戏,在这个游戏中,你可以在同一时间以相同的形式控制X个角色,他们可以随时死亡。我的问题是当我想让游戏摄像机包含所有这些游戏对象时

我认为一个很好的选择是计算场景中游戏对象之间的中心点,并使相机以一定距离跟随该点。

我已经有了摄像头代码,但我仍然需要知道如何获取中心点或其他方法。此外,相机不会线性地跟随任何轴(X、Y、Z),因为它的放置方式是视图是等距的(游戏是3D的)

最后一个重要事实是,游戏中运行的所有游戏对象(活动的)都存储在
公共静态列表中,以便能够随时访问这些游戏对象的组件。此外,如果角色(游戏对象)死亡或出生,则列表将毫无问题地更新

我给大家留下一个有三种不同情况的图形示例,分别是黑色点、场景中的角色(游戏对象)和红色点,我想找到的中心点(向量)

此外,我保留了摄像头代码,以便您可以测试是否有任何解决方案:

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);

    }
}
公共类摄像机运动:单一行为{
矢量3新位置;
public static List playersInGame=new List();
无效更新(){
//获取中心向量
//将playersInGame[0].transform.position替换为中心向量
//newPos=Vector3.Lerp(gameObject.transform.position,“中心向量”,Time.deltaTime);
newPos=Vector3.Lerp(gameObject.transform.position,playersInGame[0].transform.position,Time.deltaTime);
gameObject.transform.position=新向量3(newPos.x、newPos.y、newPos.z);
}
}

提前非常感谢

你需要取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),但我在这里举了一个例子:

如果您想找到一个解决方案,使您的相机能够最好地定位以查看所有对象,请尝试此方法

public Vector3 FindCenterOfTransforms(List<Transform> transforms)
{
    var bound = new Bounds(transforms[0].position, Vector3.zero;
    for(int i = 1; I < transforms.length; i++)
    {
        bound.Encapsulate(transforms[i].position);
    }
    return bound.center;
}
public Vector3 findcenterofttransforms(列表转换)
{
var-bound=新边界(变换[0]。位置,向量3.0;
for(int i=1;i
它工作完美(添加修改以适应我的代码)。太简单了,我不好意思问。非常感谢你睁开我的眼睛!@VickyVicent这是一个很好的解决方案,它可以处理少量对象,但是如果有更大的集合,你可以根据对象的分布最终得到一个奇数的中心点。例如,如果你有20个对象聚集在一个区域,那么如果是另一个对象,这里计算的中心点与异常值对象的距离会非常远。请记住!@Serlite你是对的。我尝试了许多对象,其中一个远离其余对象,但出现了一些奇怪的结果(尽管中心仍然正确),但正如我所控制的,每个新的游戏对象何时会出现,这不是一个问题。代码中可以包含一个有趣的选项,即如果对象不在相机的视野内,相机可以放大/缩小,但你必须平等地控制游戏对象。感谢评论!