Object reference not set to an instance of an object unity как исправить
Перейти к содержимому

Object reference not set to an instance of an object unity как исправить

Null Reference Exceptions

A NullReferenceException happens when you try to access a reference variable that isn’t referencing any object. If a reference variable isn’t referencing an object, then it’ll be treated as null . The run-time will tell you that you are trying to access an object, when the variable is null by issuing a NullReferenceException .

Reference variables in c# and JavaScript are similar in concept to pointers in C and C++. Reference types default to null to indicate that they are not referencing any object. Hence, if you try and access the object that is being referenced and there isn’t one, you will get a NullReferenceException .

When you get a NullReferenceException in your code it means that you have forgotten to set a variable before using it. The error message will look something like:

This error message says that a NullReferenceException happened on line 10 of the script file Example.cs . Also, the message says that the exception happened inside the Start() function. This makes the Null Reference Exception easy to find and fix. In this example, the code is:

The code simply looks for a game object called “wibble”. In this example there is no game object with that name, so the Find() function returns null . On the next line (line 9) we use the go variable and try and print out the name of the game object it references. Because we are accessing a game object that doesn’t exist the run-time gives us a NullReferenceException

Null Checks

Although it can be frustrating when this happens it just means the script needs to be more careful. The solution in this simple example is to change the code like this:

Now, before we try and do anything with the go variable, we check to see that it is not null . If it is null , then we display a message.

Try/Catch Blocks

Another cause for NullReferenceException is to use a variable that should be initialised in the Inspector A Unity window that displays information about the currently selected GameObject, asset or project settings, allowing you to inspect and edit the values. More info
See in Glossary . If you forget to do this, then the variable will be null . A different way to deal with NullReferenceException is to use try/catch block. For example, this code:

In this code example, the variable called myLight is a Light which should be set in the Inspector window. If this variable is not set, then it will default to null . Attempting to change the color of the light in the try block causes a NullReferenceException which is picked up by the catch block. The catch block displays a message which might be more helpful to artists and game designers, and reminds them to set the light in the inspector.

NullReferenceException в Unity

Поскольку многие пользователи сталкиваются с NullReferenceException: Object reference not set to an instance of an object ошибкой в ​​Unity, я подумал, что было бы неплохо собрать из нескольких источников некоторые объяснения и способы исправления этой ошибки.

симптомы

Я получаю сообщение об ошибке ниже, появляющееся в моей консоли, что это значит и как я могу это исправить?

NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта

Тип значения против Тип ссылки

Во многих языках программирования переменные имеют так называемый «тип данных». Двумя основными типами данных являются типы значений (int, float, bool, char, struct, . ) и ссылочный тип (экземпляр классов). В то время как типы значений содержат само значение , ссылки содержат адрес памяти, указывающий на часть памяти, выделенную для хранения набора значений (аналогично C / C ++).

Например, Vector3 это тип значения (структура, содержащая координаты и некоторые функции), в то время как компоненты, прикрепленные к вашему GameObject (включая ваши собственные сценарии, наследуемые от MonoBehaviour ), являются ссылочным типом.

Когда я могу получить исключение NullReferenceException?

NullReferenceException сбрасываются, когда вы пытаетесь получить доступ к ссылочной переменной, которая не ссылается на какой-либо объект, поэтому она имеет значение null (адрес памяти указывает на 0).

Некоторые общие места NullReferenceException будут подняты:

Управление GameObject / Component, который не был указан в инспекторе

Извлечение компонента, который не присоединен к GameObject, а затем попытка манипулировать им:

Доступ к GameObject, который не существует:

Примечание: Будьте осторожны, GameObject.Find , GameObject.FindWithTag , GameObject.FindObjectOfType возвращать только геймобжекты, которые включены в иерархии , когда функция вызывается.

Попытка использовать результат получателя, который возвращает null :

Доступ к элементу неинициализированного массива

Менее распространенный, но раздражающий, если вы не знаете об делегатах C #:

Как исправить ?

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

Проще сказать, чем сделать? Да, в самом деле. Вот несколько советов, чтобы избежать и определить проблему.

«Грязный» способ: метод try & catch:

«Чистый» способ (ИМХО): чек

Когда вы сталкиваетесь с ошибкой, которую вы не можете решить, всегда полезно найти причину проблемы. Если вы «ленивы» (или если проблему легко решить), используйте Debug.Log для отображения на консоли информацию, которая поможет вам определить причину проблемы. Более сложным способом является использование точек останова и отладчика вашей IDE.

Использование Debug.Log весьма полезно для определения, например, какая функция вызывается первой. Особенно, если у вас есть функция, отвечающая за инициализацию полей. Но не забудьте удалить их, Debug.Log чтобы не загромождать вашу консоль (и по соображениям производительности).

Еще один совет, не стесняйтесь «обрезать» свои вызовы функций и добавить, Debug.Log чтобы сделать некоторые проверки.

Сделайте это, чтобы проверить, установлены ли все ссылки:

Источники:

Хотя мы можем легко выполнить проверку, чтобы убедиться, что мы не пытаемся получить доступ к нулевой ссылке, это не всегда подходящее решение. Во многих случаях в программировании Unity наша проблема может быть связана с тем, что ссылка не должна быть нулевой. В некоторых ситуациях простое игнорирование нулевых ссылок может нарушить наш код.

Например, это может быть ссылка на наш контроллер ввода. Здорово, что игра не вылетает из-за исключения с нулевой ссылкой, но нам нужно выяснить, почему нет контроллера ввода, и исправить эту проблему. Без этого у нас есть игра, которая может не рухнуть, но также не может принять ввод.

Ниже я перечислю возможные причины и решения, так как сталкиваюсь с ними в других вопросах.

Вы пытаетесь получить доступ к классу «менеджер»?

Если вы пытаетесь получить доступ к классу, который действует как «менеджер» (то есть, к классу, который должен иметь только один экземпляр за раз), вам лучше использовать подход Singleton . К классу Singleton в идеале можно обращаться откуда угодно, напрямую, сохраняя public static ссылку на себя. Таким образом, Singleton может содержать ссылку на активный экземпляр, который будет доступен без необходимости каждый раз устанавливать фактическую ссылку.

Вы ссылаетесь на экземпляр вашего объекта?

Обычно просто помечают ссылку как public , чтобы мы могли установить ссылку на экземпляр через инспектор. Всегда убедитесь , что вы бы установить ссылку на экземпляр, с помощью инспектора, так как это не редкость , чтобы пропустить этот шаг.

Вы инстанцируете свой экземпляр?

Если мы настраиваем наш объект в коде, важно убедиться, что мы создаем его экземпляр . Это может быть выполнено с использованием new ключевого слова и методов конструктора. Например, рассмотрим следующее:

Мы создали ссылку на a GameObject , но она ни на что не указывает. Доступ к этой ссылке как есть приведет к исключению пустой ссылки . Прежде чем ссылаться на наш GameObject экземпляр, мы можем вызвать метод конструктора по умолчанию следующим образом:

Учебник Unity по классам объясняет практику создания и использования конструкторов.

Используете ли вы GetComponent<t>() метод с предположением, что компонент существует?

Во-первых, убедитесь, что мы всегда вызываем GetComponent<t>() до вызова методов из экземпляра компонента.

По причинам, не заслуживающим внимания, мы можем предположить, что наш локальный игровой объект содержит определенный компонент, и попытаться получить к нему доступ GetComponent<t>() . Если локальный игровой объект не содержит этот конкретный компонент, мы вернем null значение.

Вы можете легко проверить, является ли возвращаемое значение null , до доступа к нему. Однако, если ваш игровой объект должен иметь обязательный компонент, может быть лучше убедиться, что он по крайней мере имеет версию этого компонента по умолчанию . Мы можем пометить MonoBehaviour как, [RequireComponent(typeof(t))] чтобы гарантировать, что у нас всегда есть этот тип компонента.

Вот пример MonoBehaviour для игрового объекта, который всегда должен содержать Rigidbody . Если сценарий добавляется к игровому объекту, который не содержит Rigidbody , создается значение по умолчанию Rigidbody .

Вы пытались пересобрать свой проект?

В некоторых случаях Unity может вызвать проблемы, пытаясь ссылаться на кэшированную версию игрового объекта. В соответствии со старым решением «выключите и снова включите», попробуйте удалить папку библиотеки и заново открыть Unity. Unity будет вынуждена пересобрать ваш проект. Это может решить некоторые очень специфические случаи этой проблемы и должно указывать на проблемы, которые не возникнут в окончательной сборке.

NullReferenceException: Object reference not set to an instance of an object #351

Right after installing the extenstion, and opening the Github Window the console is spammed with errors and the window is blank. The settings window works tho.

Steps to Reproduce

  1. [First Step]
    Install Github for Unity
  2. [Second Step]
    Open the Github Window
  3. [and so on. ]
    Look at console

Expected behavior: [What you expect to happen]
For the window to show up with no errors
Actual behavior: [What actually happens]
The window is blank and there are errors
Reproduces how often: [What percentage of the time does it reproduce?]
100% of the time

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *