void Start()
{
var allchildren = AddDescendantsWithTag(transform);
}
а также
private List<GameObject> AddDescendantsWithTag(Transform parent)
{
List<GameObject> list = new List<GameObject>();
foreach (Transform child in parent)
{
list.Add(child.gameObject);
AddDescendantsWithTag(child);
}
return list;
}
Но он возвращает только детей первого уровня под родителем.
И я хочу зациклиться до конца.
Сценарий прикреплен к преобразованию, а преобразование также является родителем.





Когда вы делаете свой рекурсивный вызов, вы отбрасываете значение, поэтому информация не передается обратно рекурсии. Это легко исправить.
private List<GameObject> AddDescendantsWithTag(Transform parent)
{
List<GameObject> list = new List<GameObject>();
foreach (Transform child in parent)
{
list.Add(child.gameObject);
list.AddRange(AddDescendantsWithTag(child));
}
return list;
}
Этот ответ правильный. Я добавил еще один ответ только ради производительности (чтобы избежать копирования и выделения новых списков при каждом повторном входе в метод)
@Tim Да, если подумать, крайне неэффективно. Надеюсь, это даст ОП некоторое представление о рекурсии.
Вы повторно выделяете новый список, а затем выбрасываете его. Вы, вероятно, просто хотите выделить один список и добавить в него. Попробуй это:
void Start()
{
var allchilds = new List<GameObject>();
AddDescendantsWithTag(transform, allchilds);
}
private void AddDescendantsWithTag(Transform parent, List<GameObject> list)
{
foreach (Transform child in parent)
{
list.Add(child.gameObject);
AddDescendantsWithTag(child, list);
}
}
Один дочерний элемент — несколько дети (не «дочерние»)