Почему функция не возвращает всех детей рекурсивно? - PullRequest
0 голосов
/ 08 мая 2019
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;
}

Но возвращаются только дочерние элементы первого уровня под родителем.

И я хочу зациклить до конца.

Скрипт присоединен к transform, а transform также является родительским.

Ответы [ 2 ]

3 голосов
/ 08 мая 2019

Вы повторно выделяете новый список, а затем выбрасываете его. Вы, вероятно, просто хотите выделить один список и добавить к нему. Попробуйте это:

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);
    }
}
2 голосов
/ 08 мая 2019

Когда вы делаете рекурсивный вызов, вы отбрасываете значение, чтобы информация не передавалась обратно в рекурсию. Это легко исправить.

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...