- Home /
Raycast: nullreferenceException error spammed, yet working...
Everything is working fine, so my code "should" be good, but it is bugging me that this error is, despite everything, spammed about 60 times/s. That could be a performance issue, also...
My code is supposed to detect interactable sprites when hovered by a raycast, then turn them into an other sprite to indicate to the player that he can "activate" it.
Here's my code:
void Update()
{
Ray ray = new Ray(transform.position, transform.forward);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, interactDistance))
{
hit.collider.GetComponent<Interactable_hint>().Hovered(); // This line is the problematic one. Somehow, unity didn't understand that I stated "if" just before...
if ((hit.collider.CompareTag("People")) && (!IsTalking2))
{
if (Input.GetKeyDown(KeyCode.Mouse0))
{
if (IsTalking == false)
{
hit.collider.GetComponent<DialogTrigger>().TriggerDialog();
IsTalking = true;
}
else
{
FindObjectOfType<DialogManager>().DisplayNextSentence();
}
}
}
if (hit.collider.CompareTag("Door"))
{
if (Input.GetKeyDown(KeyCode.Mouse0))
{
hit.collider.transform.parent.GetComponent<DoorScript>().ChangeDoorState();
}
}
}
As you can see, this is a very simple code to interact with various object from a first-person camera. So why am I spammed with that error "Object reference not set to an instance of an object"? (For it is working as intended ><)
Answer by braisque · Mar 28, 2019 at 08:20 PM
I solved it. Not the cleanest solution, I guess, but it works. I just moved the problematic line.
Ray ray = new Ray(transform.position, transform.forward);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, interactDistance))
{
if ((hit.collider.CompareTag("People")) && (!IsTalking2))
{
hit.collider.GetComponent<Interactable_hint>().Hovered();
if (Input.GetKeyDown(KeyCode.Mouse0))
{
if (IsTalking == false)
{
hit.collider.GetComponent<DialogTrigger>().TriggerDialog();
IsTalking = true;
}
else
{
FindObjectOfType<DialogManager>().DisplayNextSentence();
}
}
}
if (hit.collider.CompareTag("Door"))
{
hit.collider.GetComponent<Interactable_hint>().Hovered();
if (Input.GetKeyDown(KeyCode.Mouse0))
{
hit.collider.transform.parent.GetComponent<DoorScript>().ChangeDoorState();
}
}
}
The cleanest solution is:
Interactable_hint component = hit.collider.GetComponent<Interactable_hint>();
if(component != null)
{
component.Hovered();
}
Answer by myzzie · Mar 28, 2019 at 07:09 PM
You don't have a layer mask so the ray hits everything with a collider in range. Does every gameobject with a collider in your scene have a component called Interactable_hint attached to it? If not, it'll be null and can therfore not call Hovered(), which will throw a null exception.
I didn't know about Layer$$anonymous$$ask. I tried it and it was indeed a nice clean solution, but... But With layer masks activated, I could interact with objects through walls. So I had to do something else.
Your answer
Follow this Question
Related Questions
Raycasting error 1 Answer
nullreference exeptio, object reference not set to an instance of an object 1 Answer
raycasting in c# - NullRefrenceException error 2 Answers
RaycastHit2D.collider is null - why? 1 Answer
NullRefException in RaycastAll 2 Answers