как динамически изменить слой обьекта с изменением всех дочерных обьектов в unity?

я хочу изменить слой одного объекта и всех child объектов в unity.

попробовал изменить с : gameobject.layer = 0; но он изменил слой который этот скрипт прикреплён, а мне хотелось чтоб код изменил все слои child объектов.


Ответы (1 шт):

Автор решения: Qwer

Это задача на обход дерева, т. е. посещения всех его узлов, в твоём случае узел - это трансформация.

Общий алгоритм такой:

  1. Заводим хранилище, где будем хранить (запоминать) трансформации, которые надо обработать.
  2. Помещаем туда стартовую трансформацию.
  3. Извлекаем трансформацию из хранилища.
  4. Делаем с ней что нужно.
  5. Её детей помещаем (запоминаем) в хранилище.
  6. Повторяем с пункта 3.

using System.Collections.Generic;

void SetLayer (Transform root, int layer)
{
    //хранилище, где будем хранить (запоминать) трансформации с которыми надо отработать
    Queue<Transform> queue = new Queue<Transform>();

    queue.Enqueue(root); //помещаем первую трансформацию с которой начнём

    while (queue.Count > 0) //пока в хранилище есть трансформации для работы...
    {
        Transform current = queue.Dequeue(); //...извлекаем трансформацию для работы из хранилища

        current.gameObject.layer = layer; //...делаем, что нужно, в твоём случае - устанавливаем слой

        //...запоминаем всех детей текущей трансформации
        foreach (Transform child in current)
        {
            queue.Enqueue(child);
        }
    }
}
→ Ссылка