“您要实例化的对象为空”但是它可以工作,我可以忽略该错误吗?


18

这从来没有发生在我身上,所以我有点困惑。

GameObject someObject = Instantiate (Resources.Load ("Prefabs/Items/" + someName)) as GameObject;

这将引发错误,但实际上已实例化该对象,并且一切都按预期工作。无论我重现此错误几次,该错误都不会停止程序。

我可以忽略此错误,还是没有看到一些问题?


32
您永远不应忽略错误。他们总是在那里是有原因的;)
Gabriele Vierti 18-10-31

5
我想支持一下不要因为“它起作用”而忽略错误的想法。根据定义,如果有错误,则不起作用。当然,它似乎可以完成您想要做的所有事情,但这仅意味着您还没有发现损坏的地方。
基金莫妮卡的诉讼

Answers:


46

如果尽管该Intantiate()行引发了异常,但该对象仍被正确实例化,则该错误来自脚本的另一个实例-您可能不小心在场景中有了第二个副本。

一个实例已正确配置,并且Instantiate()按预期执行且没有错误,因此可以根据需要创建对象。

另一个实例配置错误,并引发错误。但是,如果您只是在查看正确配置的实例,则该错误似乎无处不在并且没有可见的结果。

您可以在“开始”处打印出对象的路径,也可以在违规行之前以空检查的形式打印出该对象的路径,以帮助跟踪不需要的场景重复项。

您绝对不应忽略此错误。

充其量,它不必要地消耗了计算周期。在最坏的情况下,这表明您的游戏正在做您尚不完全了解的事情,这可能是造成更大问题的根源。


12
+1,错误与警告不同,如果有错误,您永远不知道何时会升级为整个游戏崩溃。
TomTsagk '18 -10-31

13
同样,忽略警告也不总是安全的。即使这不是错误,也可能会导致游戏崩溃。
肖恩·伯顿

2
我同意@SeanBurton,忽略警告不是安全的做法。当且仅当您了解造成该警告的原因并且对它不会导致代码中的问题感到满意时,才应忽略该警告。即使那样,问自己是否做得更好。
杰克·艾德利

3
我与一个大型团队合作的每个项目在某个时候都被“可忽略”的警告所淹没,以至于开始掩盖真正的问题。因此,我绝对会提倡认真对待警告,如果不可避免,请在相关行中将其禁用,并添加一条明确定义为什么可以安全地在此处跳过生成警告的注释。
DMGregory

1
我100%使用@DMGregory,我只在非常小的团队中工作,但是两次警告开始堆积,发现“真正的”问题真是太可怕了,否则您将一直错过它们。我的职责是保持日志干净(测试除外),即使我必须禁用插件代码上的警告(请不要将带有警告的插件制作成永远),从长远来看,这要好得多。编辑:要清楚,切勿禁用警告,除非您100%确信没有其他办法(发生率0.001%),请始终进行实际修复。
Trisibo '18年

21

回答

首先让我直接回答您的问题:

它有效,我可以忽略该错误吗?

可以的。您不应该这样做,因为这意味着出了点问题。您会习惯此错误,但是它可能会“隐藏”或引起另一个错误。

当前,您有一条错误消息,它仍然可以正常工作。周围的其他方法,它工作,没有(或者说:不承认)反馈的原因,是差远了!

忠告

为了找出问题的根源,请将整个过程分成几行。

string resourceLocation = "Prefabs/Items/" + someName;
Object prefab = Resources.Load(resourceLocation);
Object instance = Instantiate(prefab);
GameObject someObject = instance as GameObject;

错误只会告诉您发生在哪一行。如果此代码中发生错误,则行号将告诉您更多有关此处哪部分出错的信息。另外,我建议您使用的通用版本Resources.Load,这实际上可以使我们减少担心的几步:

string resourceLocation = "Prefabs/Items/" + someName;
GameObject prefab = Resources.Load<GameObject>(resourceLocation);
GameObject someObject = Instantiate(prefab);

找出原因

  • 现在,一些Unity经验告诉我们“您要实例化的对象为null”是由引起的Instantiate()
  • 因此,这意味着prefabnull
  • 这样就意味着Resources.Load回报null
  • 文档Resources.Load说:“ 如果找到资产,path则返回资产,否则返回null。
  • 因此,这意味着它找不到给定的路径(我叫的字符串resourceLocation

此路径有问题,因此显而易见的第一步是使用Debug.Log查看其最终结果。由于“一切都按预期工作”,一个版本可能在工作上发生重复,而另一个版本会出现此错误。

在这种情况下,最好使用Debug.Log的2参数版本Debug.Log(resourceLocation, gameObject);。现在,如果您在Unity编辑器中单击日志消息,它将选择GameObject其来源。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.