在编辑器内可找到所需脚本组件,可打包后却报错
问题描述:
我设置了一个预制体,该预制体需要获取我写好的PlayerProperties脚本的信息,我的PlayerProperties挂载在gamecontroller(场景内一个空物体上),准备通过它的标签EditorOnly来获取该物体,进而获取该物体的PlayerProperties脚本,这个操作在编辑器里能实现,可是在打包后实现不了
这是打包后报错信息
unity编辑器版本:2022.3.5f1c1
vs是2022版
官方对NullRererenceException
这个问题的介绍:
如果不太清楚怎么操作的话,可以按照这个进行操作:
在 C# 中,通常这是由于引用尚未初始化的字段引起的。
例如,如果您有一个字段public List<GameObject> items
,
并且您稍后调用items.Add(foo)
而没有先执行items = new List<GameObject>()
,
那么您正在尝试将一个项目添加到不存在的列表中。
然而,特别是在 Unity 中,这最常见的原因是忘记在检查器中设置引用。
当您创建新组件并添加字段时public Transform destination
,
您很可能打算在检查器中分配预制件。
如果你忘记了,你就是在试图引用一些不存在的东西。
如果双击控制台窗口中的错误消息,
Unity 将(有少数例外)突出显示层次结构中引发错误的 GameObject,
然后打开代码编辑器并突出显示发生错误的脚本行。
如果您使用任何Find
类似的方法来获取游戏对象,请确保该游戏对象处于活动状态,
否则Find
类似的方法将返回 null 或可能返回错误的游戏对象。
如果您需要 GameObject 在找到时处于非活动状态,则需要使用不同的方式来获取对 GameObject 的引用,
而不是使用类似方法Find
直接查找 GameObject,例如让组件注册为 Manager 类型班级。
查看 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 的更深入的解释。
如有问题随时沟通
如有帮助欢迎采纳