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

Vic*_*ent 4 c# unity-game-engine

我创建了一个游戏,您可以在其中以相同的形式同时控制 X 个角色,并且他们可以随时死亡。我的问题是当我希望游戏相机包含所有这些游戏对象时。

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

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

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

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

在此处输入图片说明

另外,我留下了相机代码,以便您可以测试是否有任何解决方案:

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

    }
}
Run Code Online (Sandbox Code Playgroud)

非常感谢您提前!

小智 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;
}
Run Code Online (Sandbox Code Playgroud)


Mic*_*ael 6

您需要取平均值 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;
Run Code Online (Sandbox Code Playgroud)

让我知道这是否适合您(目前无法访问 Unity),但我在这里整理了一个示例:https : //dotnetfiddle.net/jGd99I

  • 它工作完美(添加修改以适应我的代码)。太简单了,我都不好意思问了。非常感谢你打开我的眼睛! (2认同)
  • @VickyVicent 很好的解决方案,它适用于少量对象,但如果有更大的集合,根据对象的分布,您最终可能会得到一个奇怪的中心点。例如,如果您有 20 个对象聚集在一个区域中,然后另一个对象在远处,则此处计算的中心点将与异常对象相距很远。只是要记住一些事情! (2认同)