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.
Всегда получайте предыдущий уровень и следующий уровень, но не проходите внутрь, если на следующем уровне у какого-то ребенка есть еще дети.
Сначала получить детей ребенка, в конце концов попасть внутрь больше, как больше уровней.
Я сделал простой скрипт для вас.
Вызовите метод 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);
}
}
}