【Unity Debug篇】如何解决空引用异常(NullReferenceException)

什么是空引用异常

对于新手来说,Unity 90%的运行时错误都是NullReferenceException,这里就不放chatGpt的废话了,其就是字面意思,因为各种各样的原因造成了没有引用任何东西的情况。

调试的4个步骤

  1. 找到报错位置
  2. 分析哪些造成对象可能为null的原因
  3. 找到这个出问题的对象(断点、Debug.Log(),Console.WriteLine()
  4. 根据你的判断,决定如何处理这个对象。

例子1:一般错误

public class TestNullRef : MonoBehaviour
{
    
    
    private object myObject;
    void Start()
    {
    
    
        Debug.Log(myObject);//null
        myObject.ToString();
    }
}

在这里插入图片描述

根据上面的报错提示,先找到错误的位置,接着理清问题后,就该如何规避了:

  • 设个条件判断
  • 让类实例,从而实现分配
void Start(){
    
    
    myObject=new TestObject();
    Debug.Log(myObject);
    myObject.ToString();
}

private class TestObject{
    
    }

在这里插入图片描述

例子2:移动物体

一开始我先不设变量的值。

在这里插入图片描述

//代码无误的
public class MoveToTarget : MonoBehaviour
{
    
    
    [SerializeField] private Transform targetTransform;
    void Update()
    {
    
    
        Vector3 moveDir = (targetTransform.position - transform.position).normalized;
        float moveSpeed = 1f;
        transform.position += moveDir * moveSpeed * Time.deltaTime;
        //朝相反的方向移动,远离
        //targetTransform.position += moveDir * moveSpeed * Time.deltaTime;
    }
}

报错:未获取变量。

在这里插入图片描述

如果去掉[SerializeField]改为

private Transform targetTransform;

在这里插入图片描述

那么,我们想解决问题,先找到错误的位置了,使用Debug.Log()查找

void Update()
{
    
    
    Debug.Log(targetTransform);
    Debug.Log(transform);
    Vector3 moveDir = (targetTransform.position - transform.position).normalized;
    float moveSpeed = 1f;
    transform.position += moveDir * moveSpeed * Time.deltaTime;
}

在这里插入图片描述

无论是上述哪个错误,就是没写targetTransform变量的值,补上相应的GameObject就好了。

请添加图片描述

我们除了解决这个特定的问题,我们还可以获得什么?

其实存在很多原因造成空引用异常,比如找不到你设置的变量(当然也可能你没设),或者是局部变量与全局变量有冲突等等。

所以我们更应该要培养自己debug的能力,也不要太过依赖chatGpt,因为它有时挺不靠谱的。

猜你喜欢

转载自blog.csdn.net/kokool/article/details/129847025