当前位置:   article > 正文

【Unity】(土方法+插件方法)如何解决空引用异常NullReferenceException_unity 引用失败

unity 引用失败

什么是空引用异常

对于新手来说,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();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

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

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

private class TestObject{}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

例子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;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

报错:未获取变量。

在这里插入图片描述

如果去掉[SerializeField]改为

private Transform targetTransform;
  • 1

在这里插入图片描述

那么,我们想解决问题,先找到错误的位置了,使用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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述

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

请添加图片描述

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

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

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

额外的方法

  1. 如果是抄别人的教程和代码,遇到null情况,可以选择重启Unity再次运行游戏即可,因为别人都敢出教程了,基本不太可能遇到问题。
  2. 我写有限状态机时,选择把游戏对象的数据与逻辑进行分层,当inspector显示数据信息,我又运行游戏时,也会报这个错误,总之有些空错误不是自己的问题。

插件方法

https://assetstore.unity.com/packages/tools/game-toolkits/missing-reference-finder-257205

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/100668
推荐阅读
相关标签
  

闽ICP备14008679号