游戏引擎:Unity
版本:2019.4.6f1 【2017版本以上均可】
编译平台:Visual Studio 2019
| 描述 | |
|---|---|
| 原 文 | [报错] NullReferenceException: Object reference not set to an instance of an object XXX |
| 中 译 | 空引用异常:对象引用未设置为对象的实例XXXX |
注意:这是一个逻辑层错误所导致的 Error 类型警告。
方案一:脚本内部的变量、属性未被赋值(抛出Null引用)
- 未对 Component/GameObject 对象赋值。
解决方法:需使用GetComponent<>(),FindObjectsOfType()等方法来赋值对象。 - 未对内部 属性、字段 进行开辟空间。
解决方法:初始化阶段进行例如 public Listobjects = new List ();
注意:赋值操作可以是脚本内部逻辑赋值 或 外部Inspector面板拖拽赋值。在进入Runtime后,对字段属性调用时,仍然显示为Null。需根据实际需求,在保持调用时新建该对象或查询该对象(有则赋予,无则创建)思想。
方案二:检查实例化对象是否为抽象
抽象类无法实例化,导致这一过程是Null。
方案三:Unity 重编译不及时
有时候代码的修改内容并不会被 Unity 同步。多次尝试修改保存后会解决这类问题。
方案四:其他情况
存在部分情况下,双击 Unity Conslon(控制台),不会直接弹出问题处的情况,根据其提供的脚本对象逐一使用 Debug.Log() 排查,或配合Visual Studio提供的 “附加到Unity”调试功能,进行排查代码逻辑是否有误。
情景一
疑问:在脚本声明了获取Rigidbody组件的方法?却找不到?
回答:但实际上并没有给该脚本附加的对象上添加Rigidbody组件。
private void Method() { Rigidbody n_rig = transform.GetComponent();}
情景二
疑问:我在 情景一 中做了查询,确认了有这一组件。却还是找不到?
回答:好家伙!这个查询方法没有被调用!
private void Awake() { Method(); }
情景三
疑问:资源为什么没有加载出来?
回答:…哦!Sorry,这个资源的名字不是XXXX,而是xxxx。
void Method() {
GameObject object =
Insitance(Resource.Load("Prefabs/xxxx") as GameObject, transform.position);
object.transform.AddComponent();
}
情景四
疑问:都没问题,却还是报错!
回答:检查空引用报错信息,有明确指明具体空应用信息【学会如何使用控制台将更高效解决】。括弧笑
情景五
参考报错信息:Object reference not set to an instance of an objectSoundManager.ChangeBgmVolume (System.Single value)
错误信息指明问题出自于AudioManager.cs脚本内的ChangeBgmVolume()方法,如下图所示为ChangeBgmVolume()方法:
其中 soundVO:声音配置文件,bgm:游戏中的AudioSource组件。soudVO声音文件在初始化时已经配置。经排查后,发现AudioManager.cs中仅声明了AudioSource类型的存储变量bgm,但并未具体赋值。在Unity编译中出null,现如下图所示:
正因为导致Unity不清楚这个AudioSource是谁。所以我们需要拖拽一个AudioSource组件给上图,或通过代码GetComponent()来在Start()获取组件。



