团结 - 如何线性分离游戏对象的孩子?

问题描述:

目标是“扩展”给定的模型,以便每件作品都可以单独查看给用户,以便用户可以分别与每个对象进行交互(而不用担心他们实际操作哪个对象)。团结 - 如何线性分离游戏对象的孩子?

那么,如何动态地将游戏对象的孩子线性地分开?

线性例如: Linear example

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

在“膨胀”例如,我采取每个孩子和由(在这种情况下,x)拖动每个沿着相同的轴线手动将它们线性地在同一轴线上分离。如何动态地做到这一点?

首先想到的是计算子女数游戏对象有,和运行,将移动每个孩子的距离增加,这取决于孩子被移动的母公司循环。例如:child_1沿x轴移动3个单位,child_2移动6个单位,child_3 9个单位等。

这是最好的方式去做这件事吗?第一本能说,根据物体所占的大小,这在所有情况下都不起作用。一个孩子的对象可能比另一个大很多倍。如果是这种情况,最好是不是将单位分开,而是将每个子对象移动到其他碰撞边界之外?

+1

可以确定多高每个通过检查对象约为['Collider.bounds'](https://docs.unity3d.com/ScriptReference/Collider-bounds.html)。有了这些信息,确定需要移动对象的位置应该很简单,以免它们重叠。 – Serlite

+0

@Serlite是的,collider.bounds正是我所需要的。谢谢! – jtth

+0

很高兴您能够凭借该提示自行演绎出解决方案!这是学习的最佳方式。 – Serlite

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循环,看看孩子的边界与任何其他孩子的边界相交。例如:一个gameobject有4个子对象0,1,2和3。嵌套循环将比较对象0(0)和对象1(1),0对比2,0,0:3,1:2,1:3,2:3。通过这种方式,它将每个孩子的collider.bounds与每个其他孩子的孩子进行比较,以确保没有任何孩子对象正在接触。

3 - 如果物体正在接触,则移动一个比较物体,直到它不再与它相比较。例如:0:1移动对象1,直到它不再与对象零相撞。

注意:* 1f(在'移动'中)应该调整到物体之间所需的间隔距离。

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