游戏引擎: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 或其他调用该属性前完成赋值行为。
  • 检查 是否对 ListDictionaryArray 等一类属性,有确认使用过 new 方式开辟空间地址。
    默认情况下这类操作需程序初始化阶段中实现。
  • 检查NULL对象是否被创建、激活、且存在于场景中。
    例如 存在情况下,懒汉模式的单例未被创建于场景中。
  • 其他注意事项,对入门级开发者,偏向于 Inspector 窗口拖拽赋值。若未进行该操作,也同样出现该问题。

情景描述02: 确认操作过程中,有在执行前调用该方法或其他赋值行为操作,但仍然出现此类问题。

解决方式:

  • 检查 属性赋值匹配规则是否错误。
    例如 Resource.Load(Prefabs/XXX) as GameObject,实际上需要加载的是 xxx 对象。
    或是 UnityEngine.Transform引用,实际上我使用的是MyFramework.Transform,但计算机识别的TransformUnityEngine的,未发现,
  • 检查 匹配规则是否正常被调用。
    例如 匹配规则的生命周期 在调用之后。
    或是 匹配规则未纳入至生命周期内 调用。(未执行)

情景描述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 引用错误信息。
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐