首页 > 解决方案 > 在 Unity (C#) 中,为什么会出现 NullReferenceException 以及如何修复它?

问题描述

这是使用 Unity 的初学者最常问的问题之一,所以我再问一次,以解决规范NullReferenceException问题未完全回答的特定于 Unity 的原因。


我正在 Unity 中开发一款游戏,当我点击播放时,我收到一条错误消息,提示“NullReferenceException:对象引用未设置为对象的实例”,我不知道为什么会发生这种情况。是什么原因造成的,我该如何解决?

Unity 控制台窗口中读取 NullReferenceException:对象引用未设置为对象实例的错误图像

标签: c#unity3dgame-development

解决方案


解释

在 C# 中,这通常是由引用尚未初始化的字段引起的。例如,如果您有一个字段,然后您在没有先做的情况下public List<GameObject> items调用,那么您正在尝试将一个项目添加到一个不存在的列表中。items.Add(foo)items = new List<GameObject>()

然而,特别是在 Unity 中,这最常见的原因是忘记在检查器中设置引用。当您创建一个新组件并添加一个 fieldpublic Transform destination时,您很可能打算在检查器中分配一个预制件。如果你忘记了,你试图引用一些不存在的东西。

解决方案

如果您双击控制台窗口中的错误消息,Unity 将(除了少数例外)突出显示层次结构中引发错误的 GameObject,然后打开代码编辑器并突出显示发生错误的脚本行。

  1. 如果您使用任何Find-like 方法获取 GameObject,请确保 GameObject 处于活动状态,否则Find-like 方法将返回 null 或可能返回错误的 GameObject。如果您需要在找到 GameObject 时使其处于非活动状态,则需要使用与使用类似Find方法直接查找 GameObject 不同的方法来获取对 GameObject 的引用,例如让组件注册为 Manager-type班级。

  2. 查看 GameObject,确保您已在检查器中分配了应分配的所有内容。

  3. 如果所有内容都已分配,请使用引发错误的 GameObject 运行游戏。有可能你有一些东西Awake()或者Start()否定了引用,你会看到检查器切换到None.

两个未分配任何内容的 Unity 检查器字段的图像

  1. 注意你用来修改对象的方法的返回类型。例如,如果您GetComponent()在对象上调用或任何类似的操作并且未找到该组件,则它不会引发错误。它只会返回null。这可以通过以下行轻松处理:

    if(thing == null) //log an error, or do something to fix the reference else //do what you wanted to do

这应该涵盖最常见的 Unity 特定原因。如果这仍然不能解决您的问题,Unity在 NullReferenceException上的页面,对于 C# 来说,在这个答案中有更深入的 NullReferenceException 解释。


推荐阅读