Unity3D - 如何测量一堆物体的高度?

时间:2017-07-07 13:59:07

标签: c# unity3d game-physics unity2d

我在Unity中创建一个2D块堆叠游戏,您可以从x轴平移spawner对象中实例化块。我面临的问题是当筹码量过高而接近产生者时,我需要将产卵器和游戏摄像机向上移动到Y轴上。我正在测量一堆预制件以获得他们的高度使用Bounds所以我知道什么时候移动我的相机和spawner。我遇到的问题是当我调用我的GetMaxBounds函数并封装其他点时,它没有添加到我的parentBounds变量。我的parentBounds.max.y永远不会增加。我是编程和C#的新手。提前致谢。

Game view

if  (Input.GetMouseButtonDown(0)) {
        Instantiate (fallingBrick, spawnPosObj.transform.position, Quaternion.identity, parentStack.transform);
        var parentBounds = GetMaxBounds (parentStack);
        Debug.Log (parentBounds.max.y);
    }

}

Bounds GetMaxBounds(GameObject g) {
    var b = new Bounds(g.transform.position, Vector3.zero);
    foreach (Renderer r in g.GetComponentsInChildren<Renderer>()) {
        b.Encapsulate(r.bounds);
    }
    return b;
}

1 个答案:

答案 0 :(得分:3)

保留一个计数器,该计数器将存储堆栈中有多少对象存在于屏幕上,并在每次在堆栈中添加项目时递增。然后,考虑到您保存了一个项目的大小,您只需要将您的大小乘以堆栈中存在的项目数。只需将此尺寸与场景的当前垂直尺寸进行比较,并在堆叠达到屏幕垂直尺寸的80%时移动相机。

执行此操作时,请记住重置项目数,因为您可能会移动相机,并且隐藏了堆叠较低级别的大部分项目。例如,如果在移动相机时只能看到3个立方体,只需将堆叠中的项目数量设置为3即可。

由于您的问题似乎包括不会以相同方式堆叠的对象,另一种解决方案是使用Bounds。想象您正在保留堆栈中所有项目的列表,您可以评估将在表示堆栈的父对象中添加的每个对象的边界,并通过封装每个子边界来评估垂直大小。您可以在this answer中找到一个示例:

Bounds GetMaxBounds(GameObject stack) {
   var b = new Bounds(stack.transform.position, Vector3.zero);
   foreach (Renderer r in g.GetComponentsInChildren<Renderer>()) {
     b.Encapsulate(r.bounds);
   }
   return b;
}

然后,您可以通过将已评估的max对象的Bounds y值减去min y值来评估垂直大小。所以你可以有类似的东西:

float GetVerticalSize(GameObject stack) {
   var b = new Bounds(stack.transform.position, Vector3.zero);
   foreach (Renderer r in g.GetComponentsInChildren<Renderer>()) {
     b.Encapsulate(r.bounds);
   }

   float size = b.max.y - b.min.y;
   return size;
}

同样,如果您要移动相机,请确保仅对屏幕上实际显示的项目使用此解决方案。