团结 - 如何线性分离游戏对象的孩子?
目标是“扩展”给定的模型,以便每件作品都可以单独查看给用户,以便用户可以分别与每个对象进行交互(而不用担心他们实际操作哪个对象)。团结 - 如何线性分离游戏对象的孩子?
那么,如何动态地将游戏对象的孩子线性地分开?
因此,在示例中,存在一个空的游戏对象,它是3个对象的父:一立方体,球体,和胶囊。由于目前是由对象组成的,因此用户无法看到所有的孩子。
在“膨胀”例如,我采取每个孩子和由(在这种情况下,x)拖动每个沿着相同的轴线手动将它们线性地在同一轴线上分离。如何动态地做到这一点?
首先想到的是计算子女数游戏对象有,和运行,将移动每个孩子的距离增加,这取决于孩子被移动的母公司循环。例如:child_1沿x轴移动3个单位,child_2移动6个单位,child_3 9个单位等。
这是最好的方式去做这件事吗?第一本能说,根据物体所占的大小,这在所有情况下都不起作用。一个孩子的对象可能比另一个大很多倍。如果是这种情况,最好是不是将单位分开,而是将每个子对象移动到其他碰撞边界之外?
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(在'移动'中)应该调整到物体之间所需的间隔距离。
编辑 ::代码不健壮,错误检查和处理没有在这里实现。
可以确定多高每个通过检查对象约为['Collider.bounds'](https://docs.unity3d.com/ScriptReference/Collider-bounds.html)。有了这些信息,确定需要移动对象的位置应该很简单,以免它们重叠。 – Serlite
@Serlite是的,collider.bounds正是我所需要的。谢谢! – jtth
很高兴您能够凭借该提示自行演绎出解决方案!这是学习的最佳方式。 – Serlite