List 这个盒子太大了

List 这个盒子太大了,list,unity3d,collision-detection,rubiks-cube,List,Unity3d,Collision Detection,Rubiks Cube,我正在做一个rubiks立方体模拟器。要使边旋转,我在每边上都有一个碰撞器,我使碰撞器成为它们内部所有内容的父对象,单击,然后只旋转边 为了获取碰撞器中的每个对象,我使用了Physics.overlappbox,并将每个对象(除了其他面)放入如下列表中: public List<GameObject> children = new List<GameObject>(); private void Awake() { UpdateCube

我正在做一个rubiks立方体模拟器。要使边旋转,我在每边上都有一个碰撞器,我使碰撞器成为它们内部所有内容的父对象,单击,然后只旋转边

为了获取碰撞器中的每个对象,我使用了
Physics.overlappbox
,并将每个对象(除了其他面)放入如下列表中:

public List<GameObject> children = new List<GameObject>();

    private void Awake()
    {
        UpdateCubes();
    }

    void UpdateCubes()
    {
        Mesh mesh = GetComponent<MeshFilter>().mesh;

        children.Clear();

        foreach (Collider child in Physics.OverlapBox(transform.localPosition, 
            Vector3.Scale(mesh.bounds.size, transform.lossyScale) / 2, transform.rotation))
        {
            if (!child.transform.CompareTag("Side"))
            {
                children.Add(child.gameObject);
            }
        }
    }
public List children=new List();
私人空间
{
UpdateCubes();
}
void UpdateCubes()
{
网格网格=GetComponent().Mesh;
儿童。清除();
foreach(物理中的对撞机子对象.overlappox(transform.localPosition),
向量3.Scale(mesh.bounds.size,transform.lossyScale)/2,transform.rotation)
{
if(!child.transform.CompareTag(“Side”))
{
添加(child.gameObject);
}
}
}
问题是: 它看起来像是物理。重叠框太大了,因为它得到了立方体的每一块和一些奇怪的丢失的游戏对象,如下图所示:


我尝试将
transform.localScale/2
更改为
transform.lossy Scale/2
,但它不起作用。我该怎么办?

两种变换比例(有损和局部)都是乘数而不是单位,而Overlapper Box使用单位表示其位置和大小。如果比例为1且网格大小为0.1,则对象将占用0.1个单位,而不是1个单位。为了确保准确,您需要使用Mesh.bounds.size并将其乘以transform.lossyScale。这将为您提供准确的单位大小。

我让它工作了!来自另一边的碎片与另一边重叠,因为它们靠得很近。我通过增加它们之间的偏移量来修复它。

好吧,你永远不会清除列表。。您应该执行
children.Clear()在循环之前。。那么盒子的扩展完全取决于你。。。。例如,您可以执行类似于
Vector3.Scale(transform.lossyScale/2f,new Vector3(1,1,0.1f))
的操作,以使Z轴上的框变小…@derHugo我更新了代码以获得更好的上下文。我也知道我可以这么做,但我想问的是为什么它的行为会像它那样?你能检查一下
overlapper框的值吗?在进行计算之前先生成一个变量,并生成一个
Debug.Log
或使用断点。可能父对象的比例会影响最终大小。我怀疑碰撞器的大小与变换的大小不匹配。@D.B重叠框的大小是(0.5、0.5、0.5)或(0.2、0.5、0.5)或(0.5、0.2、0.5)或(0.5、0.5、0.2),可能尝试其他没有碰撞检测过程的方法。把你所有的小立方体列成一个列表,然后用坐标把它们列出来
smallCubes.Where(cube=>cube.transform.position.x==myFaceXPosition.ToList()
)。如果你能准确地知道你想要选择的脸的坐标,你就不会有缩放和选择的麻烦。我更新了我的函数,但似乎没有任何效果。(检查主柱的代码)