Ни проверка на ноль, ни проверка типа не обнаруживают уничтоженный объект / компонент? - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть проблема, для которой я нашел обходной путь, но не могу понять, почему Unity работает не так, как я ожидаю, или что я делаю неправильно. По сути, я ссылаюсь на компонент рендеринга уничтоженного объекта в скрипте (долгое время после того, как он был уничтожен), и ни проверки нуля, ни проверки типа не дают мне знать, что он уничтожен.

У меня есть скрипт, который модифицирует шейдеры временно на некоторые объекты, чтобы я мог применять к ним эффекты; когда эффекты сделаны, он возвращает материалы / шейдеры обратно такими, какими они были.

Случилось так, что я выменял оружие персонажа в том же кадре, и я запустил один из этих эффектов, поэтому сценарий завелся ссылка на средство визуализации разрушенного объекта (старое оружие). Много кадров спустя, когда эффект был закончен sh, он естественно ошибался.

enter image description here

Сначала я попытался проверить тип, чтобы проверить, была ли ссылка на средство визуализации - не повезло. Unity do c говорит, что нулевая проверка должна работать, но она все еще не работает.

if (pair.Key != null && pair.Key is Renderer renderer) { renderer.materials = pair.Value; }

Я получаю:

MissingReferenceException: The object of type 'SkinnedMeshRenderer' has been destroyed but you are still trying to access it. Your script should either check if it is null or you should not destroy the object.

activeInHierarchy также не работает.

Добавление DestroyImmediate к коду, где я уничтожаю объект, работает нормально; к моменту начала действия объекта там нет, поэтому ссылка никогда не делается. Однако это решает только эту проблему, а не другие подобные случаи.

Может кто-нибудь сказать мне, как правильно проверить ссылки на разрушенные объекты или компоненты, или я делаю что-то не так в своей проверке? Должен ли я ссылаться на gameObject вместо компонента рендеринга или что-то в этом роде?

РЕДАКТИРОВАТЬ: Поскольку комментатор попросил об этом, вот суть полного кода для эффекта. Разрушение происходит вне этого, так как оно совершенно не связано. https://gist.github.com/jackphelps/f507d949a84c53457f570c5009bcb6d4

решено - Вроде? Я изменил словарь, чтобы хранить игровой объект рендерера вместо рендерера, и, как и ожидалось, простая нулевая проверка работала для обнаружения разрушенного объекта. Я бы любил , чтобы знать, почему это не работает на рендере, и если есть правильный способ проверить!

1 Ответ

0 голосов
/ 06 февраля 2020

Лучший способ найти решение этой проблемы - хранить ссылку на gameObject, а не на сам компонент рендерера. В этом случае простая нулевая проверка в конце скрипта работает нормально, как и ожидалось.

Я не принимаю этот ответ, потому что он все еще не говорит мне, как проверить наличие компонента, когда игровой объект был удален ¯ (° _o) / ¯

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...