@soks_of_fate

Как исправить ошибку NullReferenceException: Object reference not set to an instance of an object?

на камере есть код:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class user : MonoBehaviour
{
    public float Distens = 0f;
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.E))
        {
            Ray ray=new Ray (transform.position, transform.forward);
            RaycastHit hit;
            if(Physics.Raycast(ray, out hit, Distens))
            {
                if (hit.collider.CompareTag("door"))
                {
                    hit.collider.transform.parent.GetComponent<DoorScript>().count_v();
                }
            }
        }
    }
}


и на предмете:
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;

public class DoorScript : MonoBehaviour
{
    private int count = 3;

    public void count_v()
    {
        count--;
        print(count);
        count--;
    }
}


но при звзаимодейстии возникает ошибка
NullReferenceException: Object reference not set to an instance of an object
user.Update () (at Assets/my/script/user.cs:19)

Возможно я сильно туплю, но вроде все делал по ютубу
  • Вопрос задан
  • 108 просмотров
Пригласить эксперта
Ответы на вопрос 3
GavriKos
@GavriKos Куратор тега Unity
Надо делать не по ютубу, а по уму.
99% что не туда повесили скрипт DoorScript, его не находит в объекте столкновения и все.
Ответ написан
NikFaraday
@NikFaraday
Student full-stack Developer
Ошибка NullReferenceException возникает, когда у вас какой-то объект, к которому вы обращаетесь, равен null. Почему он null? Потому что вы где-то не вызвали конструктор (Ключевое слово new)
Ответ написан
@Ezekiel4
Охотник на пиратов и сборщик монолитов
Ошибка заключается в том, что в этой строке:
hit.collider.transform.parent.GetComponent<DoorScript>().count_v();

Вы пытаетесь вызвать родительский объект у объекта, который не имеет родительского объекта. В таком случае получаете null. Если вы хотите обратиться к корневому объекту, используйте свойство root. Типа:
hit.collider.transform.root.GetComponent<DoorScript>().count_v();

Что, к слову, можно сократить до
hit.transform.root.GetComponent<DoorScript>().count_v();


Если же у вас есть вероятность, что скрипта DoorScript вообще не будет на объекте с данным тегом, то от него проще отказаться:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class user : MonoBehaviour {

	public float Distens = 0f;

	void Update() {
		if (Input.GetKeyDown(KeyCode.E)) {
			Ray ray = new Ray (transform.position, transform.forward);
			RaycastHit hit;
			if (Physics.Raycast(ray, out hit, Distens))
				if (hit.transform.root.TryGetComponent(out DoorScript door))
					door.count_v();
		}
	}
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы