这是使用Unity的初学者最常问到的问题之一,所以我再问一次,以编译一个好的答案。
我正在Unity中制作一个游戏,当我点击播放时,我得到了一个错误,说 "NullReferenceException: Object reference not set to an instance of an object"(对象引用未被设置为对象的实例) 我不明白为什么会发生这种情况。是什么原因造成的,我该如何解决?
在C#中,一般来说,这是由于引用一个尚未初始化的字段造成的。例如,如果你有一个字段 public List<GameObject> items
然后你再叫 items.Add(foo)
不经意间 items = new List<GameObject>()
那么你正试图将一个项目添加到一个不存在的列表中。
然而,具体到Unity中,这最常见的原因是忘记在检查器中设置引用。当你创建一个新的组件并添加一个字段 public Transform destination
那你很有可能打算在检查器中分配一个预制件。如果你忘记了,你就会试图引用不存在的东西。
如果你双击控制台窗口中的错误信息,Unity会(除了少数例外)高亮显示层次结构中抛出错误的GameObject,并打开你的代码编辑器,高亮显示发生错误的脚本行。
看着GameObject,确保你已经在检查器中分配了所有应该分配的东西。
如果所有的东西都已经分配好了,就用抛出错误的GameObject选择运行游戏。这有可能是你在 Awake()
或 Start()
这就是否定了引用,你会看到检查员切换到了 None
.
注意你用来修改对象的方法的返回类型。例如,如果你调用 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的解释。在这个答案中.