Как получить все дочерние объекты рекурсивно с уровнем, установленным для прохождения?

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++;
        }
    }
}

Сейчас это не совсем уровень, он просто получает количество дочерних элементов, которые я устанавливаю на уровне.

Уровень я имею в виду, как глубоко пройти цикл, чтобы получить детей. Например :

Parent
   Children2
      Children3
      Children4
      Children5
         Children6
            Children7
            Children8
   Children9

Если, например, я установлю уровень 1, он должен получить Children2 и Children9. если установить его на уровень 2, то он должен получить детей2, детей9 и детей3,4,5 если установить уровень 3, то получить также детей6, если установить уровень 4, то получить также детей7 и 8

также было бы неплохо, может быть, каким-то образом перебрать всех детей рекурсивно и отобразить все уровни, чтобы я знал, например, что есть 5 уровней или 10 уровней. но главная цель состоит в том, чтобы найти детей в зависимости от уровня от глубокого до цикла.

Я пробовал это, но он все еще не работает, как я хотел:

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.

Всегда получайте предыдущий уровень и следующий уровень, но не проходите внутрь, если на следующем уровне у какого-то ребенка есть еще дети.

Сначала получить детей ребенка, в конце концов попасть внутрь больше, как больше уровней.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
36
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я сделал простой скрипт для вас.

Вызовите метод 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);
            }
        }
    }

Другие вопросы по теме