在Unity(C#)中,为什么会出现NullReferenceException,如何解决?

问题描述 投票:0回答:1

这是使用Unity的初学者最常问到的问题之一,所以我再问一次,以编译一个好的答案。


我正在Unity中制作一个游戏,当我点击播放时,我得到了一个错误,说 "NullReferenceException: Object reference not set to an instance of an object"(对象引用未被设置为对象的实例) 我不明白为什么会发生这种情况。是什么原因造成的,我该如何解决?

Image of an error in the Unity console window that reads NullReferenceException: Object reference not set to an instance of an object

c# unity3d unityscript game-development
1个回答
4
投票

解释

在C#中,一般来说,这是由于引用一个尚未初始化的字段造成的。例如,如果你有一个字段 public List<GameObject> items 然后你再叫 items.Add(foo) 不经意间 items = new List<GameObject>()那么你正试图将一个项目添加到一个不存在的列表中。

然而,具体到Unity中,这最常见的原因是忘记在检查器中设置引用。当你创建一个新的组件并添加一个字段 public Transform destination那你很有可能打算在检查器中分配一个预制件。如果你忘记了,你就会试图引用不存在的东西。

解决办法

如果你双击控制台窗口中的错误信息,Unity会(除了少数例外)高亮显示层次结构中抛出错误的GameObject,并打开你的代码编辑器,高亮显示发生错误的脚本行。

  1. 看着GameObject,确保你已经在检查器中分配了所有应该分配的东西。

  2. 如果所有的东西都已经分配好了,就用抛出错误的GameObject选择运行游戏。这有可能是你在 Awake()Start() 这就是否定了引用,你会看到检查员切换到了 None.

Image of two Unity inspector fields with nothing assigned

  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的解释。在这个答案中.

© www.soinside.com 2019 - 2024. All rights reserved.