После удаления ребенка у объекта (из массива) он все равно отображается в массиве до удаления следующего, хотя в инспекторе он не существует C# UNITY

Рейтинг: 0Ответов: 1Опубликовано: 09.01.2023

Работаю в UNITY над инвентарем. Все слоты инвентаря занесены в массив, а добавление предметов происходит путем добавления ребенка к слоту. Дошло дело до дропа предметов, который я сделал в таком виде: каждый слот инвентаря это кнопка, по нажатию на которую (если слот не пустой) передается информация о находящемся в нем предмете и выбранном слоте в другой скрипт (ItemInfo):

if(this.GetComponentInChildren<InventoryItem>() != null){
    ItemInfo.instance.OpenInfo(this.GetComponentInChildren<InventoryItem>().item, this);
}

А далее там уже можно производить с ним различные действия. Так вот - при нажатии на кнопку выброса предмета я его удаляю так:

Destroy(activeSlot.gameObject.transform.GetChild(0).gameObject);

При этом предмет удаляется из инвентаря, что сразу видно в инспекторе (в списке слотов), но при попытке сразу же проверить его наличие, он почему-то все равно остается на месте!

for(int i = 0; i < Inventory.instance.inventorySlots.Length; i++){
    if(Inventory.instance.inventorySlots[i].GetComponentInChildren<InventoryItem>() != null){
        Debug.Log("item: " + Inventory.instance.inventorySlots[i].GetComponentInChildren<InventoryItem>().item);
    }
}

Если я ставлю эту проверку в Update(), то оно срабатывает сразу, как и если удаляю другой предмет (при этом следующий предмет удаленный оказывается в таком же положении). Но почему оно не отображается сразу?? Ведь даже в инспекторе ребенка (предмета) уже нет :(

Ответы

▲ 1Принят

UnityEngine.Object удаляются не в момент вызова метода Destroy(). Это тяжелая операция, поэтому он делает ее позже, скопом. Оптимизация.

Сама архитектура с GetComponentInChildren() и activeSlot.gameObject.transform.GetChild(0).gameObject (даже выглядит стремно) хлипкая. Я так понимаю сам слот занимается созданием, так пуская оставит у себя ссылку на созданное и выставляет null при удалении.