c# - 在 Unity (C#) 中,为什么会出现 NullReferenceException 以及如何修复它?
问题描述
这是使用 Unity 的初学者最常问的问题之一,所以我再问一次,以解决规范NullReferenceException
问题未完全回答的特定于 Unity 的原因。
我正在 Unity 中开发一款游戏,当我点击播放时,我收到一条错误消息,提示“NullReferenceException:对象引用未设置为对象的实例”,我不知道为什么会发生这种情况。是什么原因造成的,我该如何解决?
解决方案
解释
在 C# 中,这通常是由引用尚未初始化的字段引起的。例如,如果您有一个字段,然后您在没有先做的情况下public List<GameObject> items
调用,那么您正在尝试将一个项目添加到一个不存在的列表中。items.Add(foo)
items = new List<GameObject>()
然而,特别是在 Unity 中,这最常见的原因是忘记在检查器中设置引用。当您创建一个新组件并添加一个 fieldpublic Transform destination
时,您很可能打算在检查器中分配一个预制件。如果你忘记了,你试图引用一些不存在的东西。
解决方案
如果您双击控制台窗口中的错误消息,Unity 将(除了少数例外)突出显示层次结构中引发错误的 GameObject,然后打开代码编辑器并突出显示发生错误的脚本行。
如果您使用任何
Find
-like 方法获取 GameObject,请确保 GameObject 处于活动状态,否则Find
-like 方法将返回 null 或可能返回错误的 GameObject。如果您需要在找到 GameObject 时使其处于非活动状态,则需要使用与使用类似Find
方法直接查找 GameObject 不同的方法来获取对 GameObject 的引用,例如让组件注册为 Manager-type班级。查看 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 解释。
推荐阅读
- javascript - 使用 Contact Form 7 Wordpress 插件中的 javascript 在提交时将隐藏字段的值更改为复选框的值
- json - 如何忽略配置单元中的顶点失败错误
- sql - 如何合并两个表以覆盖空值并按时间戳排序?
- c++ - 将 QPushButton::clicked 信号连接到插槽时出错
- angular - 如何检查表单是否至少有一个具有数据的输入 Angular 2+ Form Validation
- cordova - Ionic 3 在 iOS 上禁用滚动反弹效果
- python - Python CSV 解析和文件生成
- c# - 正则表达式在 HTML 中查找特定标签
- python - 如何将输出文本导出到文件
- excel - Excel公式将包含周、天、小时的字符串转换为小时