有的时候,我们需要对某个对象中的全部子孙对象进行遍历处理操作。我们通常会优先想到用foreach或者for进行遍历,但往往只能遍历第一层,也就是某个对象的全部子对象,却不能遍历子对象的全部子对象。这时我们会想到嵌套循环遍历,但如果有100层呢,总不能嵌套循环100层吧。
我这里有个比较简单的方法,其实可以把某个对象比喻成树的根节点,它的子对象和孙对象是它的子节点和孙节点,我们需要实现的就是对树的遍历,这边我是用队列去实现对树进行广度优先遍历。
public void TraversalAllChildren(Transform rootNode)
{
Queue<Transform> transforms = new Queue<Transform>();
transforms.Enqueue(rootNode);
while(transforms.Count!=0)
{
Transform CurrentNode = transforms.Dequeue();
//在此处对节点进行操作,第一个节点是根节点
//......
//
foreach (Transform Node in CurrentNode)
{
transforms.Enqueue(Node);
}
}
}
思路很简单,就是先把根节点入队,再进入循环,只要队列中还存在没有处理过的节点,就不断循环,在循环体中先将需要处理的节点出队进行处理,再用foreach将该节点的子节点全部入队。直到全部节点处理完毕且没有子节点后,跳出循环。
这只是简单的方法,还可以进行优化,比如添加一个Tag,只遍历只有该Tag的子对象;对子孙对象进行计数;返回一个包含全部子孙对象的数组等等。