让变形的孩子跳过其他孩子

时间:2018-02-25 15:27:43

标签: c# unity3d

我希望得到gameObject孩子的孩子。我不是在谈论递归,我只是有一个Whole,其下有很多Segment s,每个段都有几个Tile s,如下所示:

enter image description here

目标是将这些图块放入一个集合中,然后在给定的游戏对象下将它们作为父对象。

为此,我这样做:

foreach (Transform child in whole.transform)
{ 
    foreach (Transform tile in child)
    {
        //even with the following line commented out it's the same. 
        tiles.AddElement(tile.GetComponent<Tile>());
        tile.SetParent(transform);
    }
}

这是非常简单的,除了它不起作用。它不会抛出任何异常,并且会像其他一样取出其他所有孩子:

enter image description here

代码非常基本,绝对应该有效。那些tile预制件是相同的,它们之间没有区别,除了它们的位置可能。

编辑:我操作的所有对象都处于活动状态。即使在这个设置之后,我发现跳过的瓷砖就在它们离开的地方,所有这些都是活动的。在调试模式中,我看到ChildCount是5.我逐步完成循环,它只是跳过其他所有孩子。

再次编辑:

我有预感这是一个Unity bug。

enter image description here

现在我的i 1 ,这是我们都知道的第二个索引。它返回第三个图块tile (2)(按顺序为tile,tile(1)和tile(2))。

猜猜是谁提交了错误报告。

1 个答案:

答案 0 :(得分:2)

您正在尝试在访问for循环时删除它。这就是问题所在。

这是你应该做的:

1 。找出所有子对象并将其存储在List

2 。您现在可以通过从#1 循环List来销毁或移动到另一个GameObject。

public GameObject whole;
public GameObject TrackRb;

public void moveChildren()
{
    int i = 0;

    //List to hold all child obj
    List<Transform> allChildren = new List<Transform>();

    //Find all child obj and store to that List
    foreach (Transform child in whole.transform)
    {
        foreach (Transform tile in child)
        {
            //Make sure the Tile component is attached to the child before using it
            if (tile.GetComponent<Tile>() != null)
            {
                allChildren.Add(tile);
                i += 1;
            }
        }
    }

    //Now Move them into the TrackRb
    foreach (Transform child in allChildren)
    {
        child.SetParent(TrackRb.transform);
    }

    Debug.Log(i);
}

如果你在寻找它的同时销毁或移动它,它会改变层次结构中的位置。所以你的下一个循环可能有一个空对象,跳过一些对象,甚至在下一个循环中有一个错误的对象。这就是为什么你首先获得所有对象然后将它们作为一个孩子移动到另一个Object下的原因。