как динамически изменить слой обьекта с изменением всех дочерных обьектов в unity?
я хочу изменить слой одного объекта и всех child объектов в unity.
попробовал изменить с : gameobject.layer = 0; но он изменил слой который этот скрипт прикреплён, а мне хотелось чтоб код изменил все слои child объектов.
Ответы (1 шт):
Автор решения: Qwer
→ Ссылка
Это задача на обход дерева, т. е. посещения всех его узлов, в твоём случае узел - это трансформация.
Общий алгоритм такой:
- Заводим хранилище, где будем хранить (запоминать) трансформации, которые надо обработать.
- Помещаем туда стартовую трансформацию.
- Извлекаем трансформацию из хранилища.
- Делаем с ней что нужно.
- Её детей помещаем (запоминаем) в хранилище.
- Повторяем с пункта 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);
}
}
}