Это никогда не случалось со мной, поэтому я немного растерялся.
GameObject someObject = Instantiate (Resources.Load ("Prefabs/Items/" + someName)) as GameObject;
Это выдает ошибку, но объект на самом деле создается, и все работает как задумано. Ошибка не останавливает программу, независимо от того, сколько раз я воспроизводил это.
Могу ли я игнорировать эту ошибку или есть какая-то проблема, которую я не вижу?
Ответы:
Если объект был создан правильно, несмотря на
Intantiate()
строку, выдавшую исключение, то ошибка исходит от другого экземпляра сценария - вы можете случайно получить вторую копию в вашей сцене.Один экземпляр настроен правильно и выполняет
Instantiate()
ожидаемое без ошибок, поэтому объект создается по желанию.Другой экземпляр настроен неправильно и выдает ошибку. Но если вы просто смотрите на правильно настроенный экземпляр, эта ошибка, кажется, возникла из ниоткуда и не имеет видимых последствий.
Вы можете распечатать путь к объекту при запуске - или в нулевой проверке непосредственно перед ошибочной строкой - чтобы отследить ненужные дубликаты сцены.
Вы абсолютно не должны игнорировать эту ошибку.
В лучшем случае это сжигает вычислительные циклы без необходимости. В худшем случае, это признак того, что ваша игра делает что-то, чего вы не до конца понимаете, и это может стать причиной гораздо больших проблем в будущем.
источник
Ответ
Позвольте мне начать с прямого ответа на ваш вопрос:
Вы могли бы . Вы не должны , потому что это означает, что что-то идет не так. Вы бы привыкли к этой ошибке, но она может «спрятаться» или вызвать другую ошибку.
В настоящее время у вас есть сообщение об ошибке, и оно все еще работает правильно. С другой стороны, он не работает и не имеет (или, скорее, не признает) обратной связи, почему, это намного хуже!
Совет
Чтобы выяснить, откуда это происходит, разбейте все это на несколько строк.
Ошибка только говорит вам, на какой линии это произошло. Если в этом коде произойдет ошибка, номер строки расскажет вам, какая часть здесь пошла не так. Кроме того, я бы посоветовал использовать универсальную версию
Resources.Load
, которая фактически даст нам на один шаг меньше беспокойства:Выяснить почему
Instantiate()
.prefab
естьnull
.Resources.Load
возвращаетсяnull
.Resources.Load
сказано: « Возвращает актив,path
если он может быть найден, иначе возвращает ноль ».resourceLocation
)Что-то не так с этим путем, поэтому очевидным первым шагом было бы посмотреть, что это на самом деле в конечном итоге, с Debug.Log. Поскольку «все работает как задумано», вполне вероятно, что происходит некоторое дублирование, когда одна версия работает, а другая выдает эту ошибку.
В этом случае хорошей идеей будет использование версии Debug.Log с двумя параметрами
Debug.Log(resourceLocation, gameObject);
. Теперь, если вы нажмете на сообщение журнала в редакторе Unity, оно выберет,GameObject
откуда оно пришло.источник