【问题标题】:In Unity (C#), why am I getting a NullReferenceException and how do I fix it? [duplicate]在 Unity (C#) 中,为什么我会收到 NullReferenceException,我该如何解决? [复制]
【发布时间】:2020-10-06 09:08:54
【问题描述】:

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


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

【问题讨论】:

  • 恕我直言,这应该作为副本保持关闭。对于 NRE,更一般的规范问答中的所有诊断建议仍然适用。确实,Unity3d 开发人员可以寻找更具体的东西,但这并没有使问题不同。那些更具体的东西已经在原版中以一般方式涵盖了;只是在 Unity3d 中,它们比其他错误更常见,因此值得首先检查。这个问题既可以作为路标,也可以作为放置这些更具体提示的地方,但它仍然是重复的。

标签: c# unity3d game-development


【解决方案1】:

说明

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

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

解决方案

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

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

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

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

  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 自己的页面 on NullReferenceException,对于 C#,一般来说,NullReferenceException in this answer 有更深入的解释。

【讨论】:

    猜你喜欢
    • 2017-06-19
    • 2021-10-09
    相关资源
    最近更新 更多