【问题标题】:Unity3D - How to measure the height of a stack of objects?Unity3D - 如何测量一堆物体的高度?
【发布时间】:2017-07-07 13:59:07
【问题描述】:

我正在 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;
}

【问题讨论】:

  • 只需添加堆栈中各个对象的高度即可。
  • 谢谢。问题是它们并不总是均匀堆叠。有时会跌落、旋转并以不同的高度结束。
  • 您是否在检查积木是否堆放在塔上?如果是这样,您可以遍历每个成功堆叠的对象并乘以单个块的高度。
  • 我是,但它们并不总是以相同的方式堆叠。目前正在尝试确定是否可以使用下面的 Bounds 建议获得包含所有子块对象的父堆栈对象的高度。

标签: c# unity3d game-physics unity2d


【解决方案1】:

保留一个计数器,该计数器将存储屏幕上存在的堆栈中的对象数量,并在每次将项目添加到堆栈中时递增它。然后,考虑到您保存了一个项目的大小,您只需将您的大小乘以堆栈中存在的项目数。只需将此大小与场景的当前垂直大小进行比较,然后在堆栈达到例如屏幕垂直大小的 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;
}

然后您可以通过将评估的Bounds 对象的max 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;
}

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

【讨论】:

  • 谢谢,这是有道理的。问题是堆栈增量并不总是一个块的高度。有时它们会掉落并旋转,因此最终会在下面的平台上混乱。在这种情况下有没有办法测量?我可以缩小平台并使其只能垂直堆叠并使用这种方法。
  • 如果他存储了所有成功堆叠的块,他应该仍然能够将单个块的大小和成功堆叠的没有掉落的块的数量翻倍。
  • @Lewie 我为您的情况建议了另一种解决方案。
  • @Isuka - 谢谢。对于我的情况,使用 Bounds 似乎是正确的解决方案,因为对象并不总是以相同的方式堆叠。目前正在实施此建议。
  • @Isuka - 我能够将我的块实例化为父堆栈对象。我将代码添加到帖子中。你能告诉我 GetMaxBounds 函数实现,我将通过将返回对象的 max y 值减去 min y 值来评估垂直大小以获得垂直大小?
猜你喜欢
  • 2017-05-26
  • 2015-11-22
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-24
  • 2015-10-28
相关资源
最近更新 更多