0

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

游戏视图

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;
}
4

1 回答 1

2

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

执行此操作时,请记住重置项目数量,因为您可能会向上移动相机,并且堆栈较低级别中的大多数项目将被隐藏。例如,如果您在移动相机时只让 3 个立方体可见,只需将堆栈中的项目数设置为 3。

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

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 值减去 y 值来评估垂直大小min。所以你可以有类似的东西:

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

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

于 2017-07-07T14:12:34.220 回答