Unity как удалить все дочерние объекты

от admin

Как перебрать и уничтожить всех дочерних элементов игрового объекта в Unity?

У меня есть следующий скрипт, который прикреплен к игровому объекту и запускается, когда я нажимаю кнопку в редакторе:

Он показывает, что исходное значение childCount равно 13, а окончательное значение — 6. Кроме того, если я распечатываю все i на каждой итерации, я вижу значения 0-6, показывающие, что цикл выполняется только 7 раз, не 13, как ожидалось.

Как я могу удалить всех дочерних элементов, чтобы окончательное значение было 0? Для справки, дети, которых я пытаюсь удалить, были автоматически созданы сценарием поставщика. Я также запускаю этот сценарий в [ExecuteInEditMode] , чего он стоит.

Следующий сценарий имеет такое же поведение; если childCount начинается с 4, то заканчивается на 2:

Если я попробую следующее, я получаю сообщение об ошибке времени выполнения, указывающее на строку foreach с надписью «InvalidCastException: невозможно преобразовать исходный тип в целевой» .

Как в unity удалить некоторое количество дочерних объектов?

Нужно удалить некоторое определенное количество случайных дочерних объектов(Например из 500 осталось чтоб 50). Пишу так:

Ничего не удаляется. Пишу так:

  • Вопрос задан более трёх лет назад
  • 971 просмотр
  • Facebook
  • Вконтакте
  • Twitter

наверно придется вам выкладывать мини проектик — который можно позапускать.
так на вид — код более менее адекватный, кроме момента «а что если target отрицательный??»

вот меньше 50 child)) — будете получать бесконечный цикл.

условие сделали бы
while (target>0)
а в цикле после Destroy
target—;

не стартовало бы цикл, если чаилдов недостаточно, и вообще прозрачнее все это было.

еще предложил бы без рандома, просто удалить таким циклом, чтоб убедится в работоспособности)
а так отладчик вам в руки — и смотреть чему равны переменные и почему ничего не удаляется))

Русские Блоги

Unity3D разделяет дочерние объекты, чтобы освободить родительско-дочерние отношения / удалить дочерние объекты, также можно реализовать

Что касается прекращения родительско-дочерних отношений, сначала посмотрите на официальный код объяснения.

Дана официальная функция для разрыва отношений родитель-потомок.

Используйте официальную функцию DetachChildren (), чтобы написать простой рекурсивный алгоритм для разделения всех потомков родителя (включая потомков дочернего элемента). Через метод TransRelieve. Простая модификация этого метода также может удалить всех дочерних элементов, а именно изменить функцию DetachChildren () на Destroy (gameObject).

код показан ниже:

Интеллектуальная рекомендация

Меч относится к предложению + 43: количество N сиша + Java

Оригинальное название: бросить кубики на землю, все точки кости сталкиваются с точкой точки кости. Введите n, напечатали вероятность всех возможных значений. (6 сторон каждой кости, точки от 1 до 6) Р.

Читать:
Что выполняет пустой оператор writeln

Введение в Python 4

функция ввода Использование функции Функция input () является функцией ввода. Функция input () — это функция ввода. Когда вы пишете вопрос в скобках функции, функция input () будет отображать вопрос в.

Основные операции в R 01

Повторите основную операцию секретной книги ниндзя языка R учителя Се Иихуэй.

Мастерство, создание американской легенды очистки воды

Мастера — это не только технические специалисты и квалифицированные мастера, которые могут решить некоторые практические проблемы в производстве и жизни, но также авангарды, которые могут руководить п.

курсы памяти Лу Feifei (а, понимать память понимания мозга)

Понимание памяти, что память? Понимание памяти, что память? 1 Понимание мозга 2 Что такое память Функция 3 Память 3.1 общие воспоминания путь 3.2 Факторы, влияющие на память 4 запоминающий материал Че.

Итерация по дочерним GameObject, GetComponentsInChildren — самый быстрый способ?

Как можно получить массив все дочерних и поддочерних объектов конкретного объекта?

К примеру, нужно сменить всем названия, можно конечно функцию рекурсивную использовать, но это имхо костыль, я всегда брал какой-то (любой) компонент и уже по нему обращался к объекту типа:

Есть ли ли способ лучше?

На удивление, ну ruSO эту тему еще не особо обсудили, так что распишу для будущих вопросов.

Связь родитель-потомок в Unity реализована через компонент Transform и только через него. Искать детей через другие компоненты — странная затея просто потому что Transform обязательно прикреплен к любому объекту типа GameObject .

Для итерации по Transform ‘ам всех потомков путей у нас 2:

  1. GameObject.GetComponentsInChildren<Transform>()
  2. Рекурсивно делать foreach(var child in this.transform)

Для обоих случаев напишем какой-то универсальный метод, который будет применять переданный метод к каждому потомку:

Для рекурсивного foreach(var child in this.transform)

Результаты

Методы выше кидаем в Update с рандомным методом:

Результаты на i7 6700K для объекта с числом потомков 13824:

Разница видна невооруженным глазом, и вот почему:

введите сюда описание изображения

Лишь чуть меньше половины времени тратиться на нахождение всех Transform компонентов через GetComponentsInChildren . Да и реализовано это одним вызовом к ядру Unity, которое написано на С++.

А вот рекурсивный вызов через C# постоянно будет дергать это ядро, что влечет за собой серьезные накладные расходы.

Похожие статьи