【问题标题】:Unity - How to separate the children of a game object linearly?Unity - 如何线性分离游戏对象的孩子?
【发布时间】:2017-11-16 01:03:10
【问题描述】:

目标是“扩展”给定模型,以便用户可以单独查看每个部分,以便用户可以单独与每个对象进行交互(无需担心他们实际操作的是哪个对象)。

那么,如何动态地线性分离一个游戏对象的子对象呢?

线性示例:

因此,在示例中,有一个空游戏对象,它是 3 个对象的父对象:立方体、球体和胶囊。由于对象当前已组合,因此用户无法看到所有子对象。

在“扩展”示例中,我通过沿同一轴(在本例中为 x)手动拖动每个子代,并在同一轴上将它们线性分开。如何动态地做到这一点?

首先要计算一个游戏对象的子对象数量,然后在父对象上运行一个循环,根据被移动的子对象移动每个子对象的距离。例如:child_1 沿 x 轴移动 3 个单位,child_2 移动 6 个单位,child_3 移动 9 个单位,等等。

这是解决此问题的最佳方法吗?第一直觉说这在所有情况下都不起作用,具体取决于对象占用的大小。一个子对象可能比另一个大很多倍。如果是这种情况,不是通过单位而是通过将每个子对象移动到彼此的碰撞边界之外来分隔对象会更好吗?

【问题讨论】:

  • 您可以通过检查Collider.bounds 来确定每个对象的大致高度。有了这些信息,确定您需要将对象移动到何处以使它们不再重叠应该很容易。
  • @Serlite 是的,collider.bounds 正是我所需要的。谢谢!
  • 很高兴您能够根据该提示自行推断出解决方案!这是最好的学习方式。

标签: unity3d


【解决方案1】:
int numChildren = gameObject.transform.childCount;
for (int i = 0; i<numChildren; i++)
{
    for (int a = i+1; a<numChildren; a++)
    {
        while (gameObject.transform.GetChild(a).GetComponentInChildren<Collider>().bounds.Intersects
            (gameObject.transform.GetChild(i).GetComponentInChildren<Collider>().bounds))
        {
            // print
            Debug.Log("Bounds intersecting " + i + ":" + a);

            // moving
            gameObject.transform.GetChild(a).GetComponentInChildren<Transform>()
                .transform.Translate(Vector3.right * 1f, Space.World);
        }
    }
}

1 - 获取子对象的数量

2 - 使用嵌套的 for 循环查看子边界是否与任何其他子边界相交。

例如:一个游戏对象有 4 个孩子,对象 0、1、2 和 3。嵌套循环会将对象零 (0) 与对象一 (1)、0 与 2、0:3、1:2、1:3、2:3 进行比较。通过这种方式,它将每个孩子的 collider.bounds 与每个其他孩子的进行比较,以确保没有孩子对象接触。

3 - 如果对象正在接触,它会移动比较对象,直到它不再与与之比较的对象相交。例如:0:1 移动对象 1,直到它不再与对象 0 发生碰撞。

注意:*1f(在“移动”中)应调整为对象之间所需的间距。

EDIT:: 代码不健壮,这里没有实现错误检查和处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多