【解决】NullReferenceException: Object reference not set to an instance of an object
游戏引擎:Unity
版本:2019.4.6f1 【2017版本以上均可】
编译平台:Visual Studio 2019
一、问题描述
描述 | |
---|---|
原 文 | [报错] NullReferenceException: Object reference not set to an instance of an object |
中 译 | 空引用异常:对象引用未设置为对象的实例 |
注意:这是一个逻辑层错误所导致的 Error 类型警告。
2022/11/22 更新
- 注意:在某些情况下该类型问题属于 Unity 引擎自身问题所导致。并非由于开发者程序逻辑不严谨性所导致。
二、解决方案
2.1 程序开发者主观角度
情景描述 01: 在 Runtime 模式下,抛出此异常。通过控制台指出代码行XXX行出现此问题。
解决方式:
- 检查 该行内容表现未
NULL
的字段、属性。
例如Component/GameObject
声明属性在其他类中调用时,未体验赋值。建议使用GetComponent<T>()
、FindObjectOfType<T>()
等方法在Awake/Start
或其他调用该属性前完成赋值行为。- 检查 是否对
List
、Dictionary
、Array
等一类属性,有确认使用过new
方式开辟空间地址。
默认情况下这类操作需程序初始化阶段中实现。- 检查 该
NULL
对象是否被创建、激活、且存在于场景中。
例如 存在情况下,懒汉模式的单例未被创建于场景中。- 其他注意事项,对入门级开发者,偏向于 Inspector 窗口拖拽赋值。若未进行该操作,也同样出现该问题。
情景描述02: 确认操作过程中,有在执行前调用该方法或其他赋值行为操作,但仍然出现此类问题。
解决方式:
- 检查 属性赋值匹配规则是否错误。
例如Resource.Load(Prefabs/XXX) as GameObject
,实际上需要加载的是xxx
对象。
或是UnityEngine.Transform
引用,实际上我使用的是MyFramework.Transform
,但计算机识别的Transform
为UnityEngine
的,未发现,- 检查 匹配规则是否正常被调用。
例如 匹配规则的生命周期 在调用之后。
或是 匹配规则未纳入至生命周期内 调用。(未执行)
情景描述03: 检查 实例化对象是否为抽象
原因:抽象类无法实例化,导致这一过程是
Null
。
关于其他调试排查方式:
存在部分情况下,双击 Unity Conslon(控制台),不会直接弹出问题处的情况,根据其提供的脚本对象逐一使用
Debug.Log()
排查,或配合Visual Studio提供的 “附加到Unity” 调试功能,进行排查代码逻辑是否有误。
2.2 Unity 引擎自身客观问题
情景描述: 部分情况下,此类型问题伴随解释并非指明源于开发者撰写的程序脚本。其指向均为 Unity 引擎下的 UnityEditor API对象。如下图所示:
截止 2022年11月22日,Unity 在 2021.3.6版本上仍然保留该类型问题。其造成的原因可能是 Animator 视窗,此问题频繁出现在 Unity Runtime模式下。当 Animator 被关闭后,警报错误消失。参考网络文章 Unity 论坛 可追溯此问题最早出现于 2018版本。这是 Unity 引擎自身所遗留的 BUG 问题,非开发者主观造成。
解决方案:重启 Unity 工程。
情景描述: 程序逻辑性严谨,排查无误,但仍然出现此类报错信息。
原因:这是极端情况下,Unity 重编译不及时所导致发生的问题。
- 有时候代码的修改内容并不会被 Unity 同步重编译。多次尝试修改保存后,即解决这类问题。
- 若 存在其他 Error 信息,请优先解决其他 Error 问题,这些 Error 仍能阻碍重编译进行,使得已修复的代码行无法参与编译,并抛出 Null 引用错误信息。
更多推荐
所有评论(0)