When I run this script copied from a tutorial, the Unity console consistently returns a NullReferenceException: Object reference not set to an instance of an object. This occurs when I hit right click to tell the object to move. I have made sure that the object has a NavMeshAgent component, but the engine cannot find it.
To clarify, I am not asking what a NullReferenceException is. I am asking why this script returns one, despite that I have given it an object to reference and that object is not empty. In essence I am looking to identify why the reference is finding Null, when it should be finding a NavMeshAgent component.
`
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class CharacterMovement : MonoBehaviour
{
NavMeshAgent agent;
public float rotateSpeedMovement;
float rotateVelocity;
// Start is called before the first frame update
void Start()
{
agent = gameObject.GetComponent<NavMeshAgent>();
}
// Update is called once per frame
void Update()
{
//When pressing RMB
if(Input.GetMouseButtonDown(1)){
RaycastHit hit;
//Checking if raycast has hit the navmesh system
if(Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition),out hit,
Mathf.Infinity)){
//have the player move to the point
agent.SetDestination(hit.point);
//ROTATION
Quaternion rotationToLookAt = Quaternion.LookRotation(hit.point -
transform.position);
float rotationY = Mathf.SmoothDampAngle(transform.eulerAngles.y,
rotationToLookAt.eulerAngles.y,
ref rotateVelocity,
rotateSpeedMovement * (Time.deltaTime * 5));
transform.eulerAngles = new Vector3 (0,rotationY,0);
}
}
}
}`
The object should move to the point clicked, but doesn't. I've tried using a serialised field and using
this.gameObject.GetComponent<NavMeshAgent>();
But I get the same error regardless.
There are only two variables in your script that could cause your NullReferenceException.
Your class defines one variable which could be agent
or Camera.main
.
Since other comments have ruled out agent
being null you likely do not have the MainCamera tag set on your camera thus Camera.main
results in your exception.
If that is not the case you should wrap the contents of your if statement with a try/catch to identify the object that does not have agent
set.
if (Input.GetMouseButtonDown(1))
{
try
{
RaycastHit hit;
//Checking if raycast has hit the navmesh system
if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit,
Mathf.Infinity))
{
//have the player move to the point
agent.SetDestination(hit.point);
//ROTATION
Quaternion rotationToLookAt = Quaternion.LookRotation(hit.point -
transform.position);
float rotationY = Mathf.SmoothDampAngle(transform.eulerAngles.y,
rotationToLookAt.eulerAngles.y,
ref rotateVelocity,
rotateSpeedMovement * (Time.deltaTime * 5));
transform.eulerAngles = new Vector3(0, rotationY, 0);
Debug.LogError("hello");
}
}
catch (System.NullReferenceException exception)
{
Debug.LogError("This is the object causing the exception", this);
}
}
For further reading on debugging NullReferenceExceptions have a look at this guide.