我创建了一个游戏,您可以在同一时间以相同的形式控制X个角色,并且它们可以随时死亡。我的问题是,当我希望游戏摄像机包含所有这些游戏对象时。
我认为一个不错的选择是计算场景中游戏对象之间的中心点,并使摄像机跟随该点一定距离。
我已经有了相机代码,但是我仍然需要知道如何获得中心点或另一种实现方法。另外,由于摄像机的放置方式是视图是等轴测的(游戏为3D模式),所以摄像机不会线性地跟随任何轴(X,Y,Z)。
最后一个重要事实是,所有在游戏中运行的游戏对象(有生命的)都存储在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);
}
}
非常感谢您!
答案 0 :(得分:3)
您需要取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
答案 1 :(得分:1)
如果您想提供一种解决方案,使您的相机最适合看到所有物体,请尝试
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;
}