Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Проблема с кодом

я Профи (527), на голосовании 1 месяц назад
NullReferenceException: Object reference not set to an instance of an object
InventoryManager.Update () (at Assets/Скрипты/InventoryManager.cs:60)
Выкидывает ошибку не могу понять в чём дело



void Update()
{
if (Input.GetKeyDown(KeyCode.E))
{
isOpened = !isOpened;
if (isOpened)
{
UIPanel.SetActive(true);
}
else
{
UIPanel.SetActive(false);
}
}



Ray ray = MainCamera.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if(Physics.Raycast(ray, out hit,reachDistance))
{
Debug.DrawRay(ray.origin, ray.direction*reachDistance, Color.green);
if(hit.collider.gameObject.GetComponent<Item>() != null)
{
AddItem(hit.collider.gameObject.GetComponent<Item>().item, hit.collider.gameObject.GetComponent<Item>().amount);
Destroy(hit.collider.gameObject);
}






}
else
{
Debug.DrawRay(ray.origin, ray.direction * reachDistance, Color.red);
}




private Camera MainCamera;
void Start() { MainCamera = Camera.main; }
Голосование за лучший ответ
Maksim Nadeev Профи (637) 2 месяца назад
Ошибка `NullReferenceException: Object reference not set to an instance of an object` указывает на то, что вы пытаетесь обратиться к объекту, который не был инициализирован. В вашем коде это может происходить по нескольким причинам.

1. Проверка `MainCamera`: Убедитесь, что в сцене действительно существует объект с тегом "MainCamera". Если такого объекта нет, то `Camera.main` вернет `null`, и `MainCamera` будет равен `null`. Вы можете добавить проверку в метод `Start`:

```csharp
void Start() {
MainCamera = Camera.main;
if (MainCamera == null) {
Debug.LogError("MainCamera is not found in the scene!");
}
}
```

2. Проверка `UIPanel`: Если `UIPanel` не инициализирован (например, не присвоен в инспекторе), то при попытке вызвать `SetActive` на `UIPanel` также возникнет ошибка. Убедитесь, что `UIPanel` правильно инициализирован.
3. Проверка `hit.collider`: В случае, если `Physics.Raycast` не находит коллайдер, `hit.collider` будет `null`. Перед тем, как получать доступ к компоненту `Item`, проверьте, что `hit.collider` не равен `null`:

```csharp
if (hit.collider != null) {
Item item = hit.collider.gameObject.GetComponent<Item>();
if (item != null) {
AddItem(item.item, item.amount);
Destroy(hit.collider.gameObject);
}
}
```

4. Проверка компонента `Item`:
Убедитесь, что на объектах, с которыми вы взаимодействуете, действительно есть компонент `Item`. Если он отсутствует, то `GetComponent<Item>()` вернет `null`, что также приведет к ошибке.

Исправленный метода `Update` с учетом вышеупомянутых проверок:

```csharp
void Update() {
if (Input.GetKeyDown(KeyCode.E)) {
isOpened = !isOpened;
UIPanel.SetActive(isOpened);
}

Ray ray = MainCamera.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;

if (Physics.Raycast(ray, out hit, reachDistance)) {
Debug.DrawRay(ray.origin, ray.direction * reachDistance, Color.green);

if (hit.collider != null) {
Item item = hit.collider.gameObject.GetComponent<Item>();
if (item != null) {
AddItem(item.item, item.amount);
Destroy(hit.collider.gameObject);
} else {
Debug.LogWarning("Item component not found on the hit object.");
}
}
} else {
Debug.DrawRay(ray.origin, ray.direction * reachDistance, Color.red);
}
}
```

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