如何让所有 children 的 object 递归通过级别设置?

How to get all children of object recursive with level set to go through?

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

public class GetChilds : MonoBehaviour
{
    public List<Transform> allChildren = new List<Transform>();

    // Start is called before the first frame update
    void Start()
    {
        GetChildren(10);
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    private void GetChildren(int level)
    {
        int count = 0;
        foreach (Transform child in transform.GetComponentsInChildren<Transform>())
        {
            if(count == level)
            {
                break;
            }

            allChildren.Add(child);
            count++;
        }
    }
}

现在的方式它不是一个真正的水平它只是得到然后我在水平中设置的 childs 的数量。

级别我的意思是要循环多深才能获得children。 例如:

Parent
   Children2
      Children3
      Children4
      Children5
         Children6
            Children7
            Children8
   Children9

例如,如果我将级别设置为 1,它应该得到 Children2 和 Children9 如果将它设置为 2 级,那么它应该得到 children2 children9 和 children3,4,5 如果设置为 3 级,则还获得 children6 如果设置为 4 级,则还获得 children7 和 8

也可能以某种方式循环遍历所有 children 递归并映射所有级别,这样我就会知道例如有 5 个级别或 10 个级别。但主要目标是找到 children,具体取决于循环的深度。

我试过了,但它仍然无法正常工作:

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

public class GetChilds : MonoBehaviour
{
    public List<Transform> allChildren = new List<Transform>();

    private List<int> levels = new List<int>();

    // Start is called before the first frame update
    void Start()
    {
        GetChildRecursive(transform, 3);
    }

    // Update is called once per frame
    void Update()
    {

    }

    private void GetChildRecursive(Transform obj, int level)
    {
        foreach (Transform child in obj)
        {
            if (null == child)
                continue;

            if (child.childCount > 0)
            {
                levels.Add(child.childCount);
            }

            if (levels.Count <= level)
            {
                allChildren.Add(child);
                GetChildRecursive(child, level);

                levels = new List<int>();
            }
        }
    }
}

它现在做什么:

例如,如果我有这个结构:

Child1
  Child2
  Child3
    Child5
    Child6
  Child4

如果我将级别设置为 1,则只得到 Child1

如果我将级别设置为 2,则获取 Child1、Child2、Child3、Child4

如果我将级别设置为 3,那么在这种情况下将它们全部获取。 现在的问题是,如果我将它设置为 3 级,当它到达 Child3 时,它将在 Child3 内部挖掘,我希望它只获得每个级别的顶部 Child1 Child2 Child3 Child4 而不是挖掘 Child3。

总是上一层和下一层,但如果下一层child有更多children.

,则不要进入内部

先得children一个child最后越多关卡越进

我为你做了一个简单的脚本。

使用目标变换调用 IterateOverChild 方法,0 作为当前级别参数和所需深度。

  public class TranformIterator : MonoBehaviour
    {
        void Start()
        {
            IterateOverChild(transform, 0, 2);   
        }
    
        private void IterateOverChild(Transform original, int currentLevel, int maxLevel)
        {
            if (currentLevel > maxLevel) return;
            for (var i = 0; i < original.childCount; i++)
            {
                Debug.Log($"{original.GetChild(i)}"); //Do with child what you need
                IterateOverChild(original.GetChild(i), currentLevel + 1, maxLevel);
            }
        }
    }