MissingReferenceException не имеет смысла - PullRequest
1 голос
/ 29 октября 2019

Я получаю MissingReferenceException, но это не имеет смысла, поскольку я уничтожаю GameObject, но я никогда больше не упоминаю его в коде.

Вся ошибка в консоли:

MissingReferenceException: объект типа 'GameObject' был уничтожен, но вы все еще пытаетесь получить к нему доступ.

Transform[] currentShips = shipParent.GetComponentsInChildren<Transform>();

if (currentShips.Length > 0)
{
    foreach (Transform obj in currentShips)
    {
        Destroy(obj.gameObject);
    }
}

Это не имеет смысла для меня, так как нетдругие ссылки на currentShips (а также, конечно, не на obj, поскольку он локальный). Я также пытался проверить, если currentShips != null в операторе if, но без изменений. Я предполагаю, что это просто маленькая вещь, которую я пропускаю, но для этого и создан этот сайт, верно?

Ответы [ 2 ]

3 голосов
/ 30 октября 2019

Здесь вы получаете встроенную в Unity специальную форму NullReferenceException, просто после уничтожения ссылки в Unity на самом деле не null, но все же хранит некоторую информацию, например , почему этоis null.

Так что проверка currentShips != null ничего не делает, так как отсюда не происходит исключение. Вероятно, это скорее в строке

Destroy(obj.gameObject);

, где obj уже был уничтожен!


Актуальная проблема уже упоминалась в комментариях Кей, а также в удаленном ответе. по Adriani6:

shipParent.GetComppnentsInChildren<Transform>()

включает компонент Transform самого объекта shipParent !!

Возвращает все компоненты типа type в GameObject или любом из его дочерних элементов.

Кроме того, наиболее вероятно, что shipParent * Transform является самым первым из найденных иразрушен! Поэтому в следующей итерации все дочерние элементы obj уже также помечены как уничтоженные.


Вместо этого следует использовать

foreach (Transform obj in shipParent.transform)
{
    Destroy(obj.gameObject);
}

этот встроенный итератор перечисления для TransformТип делает именно то, что вы ожидаете: Возвращает все ссылки детей первого уровня Transform.

0 голосов
/ 29 октября 2019

Следующий код должен работать. Уничтожение списка объектов должно начинаться с последнего элемента. Foreach не подходит для этого, потому что он начинается с начала списка. Когда вы уничтожаете почти половину объектов, количество оставшихся объектов не будет совпадать с индексом следующего объекта, подлежащего уничтожению.

    Transform[] currentShips = shipParent.GetComponentsInChildren<Transform>();

    if (currentShips.Length > 0)
    {
        int objCount = currentShips.Length;
        for (int i = objCount - 1; i >= 0; i--)
        {
            Destroy(currentShips[i].gameObject);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...