是这样的,在我上班水群的快乐时光中我注意到了群友抛出了这样一个问题
问题
看到这两张图,我承认,我被硬控了两秒,无论从什么地方来看,都不会出现问题呀?没辙,按照之前找bug的思路一步一步来,首先,让群友把项目整个打包出来,放到自己的测试项目中尝试复现问题,很好,我的版本为2021.3.17f,bug成功复现了
那么现在的问题是:
通过
Resources.Load<GameObject>("Item");
这段代码无法加载指定的预制体,那么通过上网查询(我懒,就直接问gpt了)我们可以知道加载这个预制体报空有可能的情况有:
资源路径错误: 确保传入的资源路径是相对于 Resources 文件夹的正确路径。路径不包括扩展名,且要确保大小写匹配。
资源未正确打包: 确保要加载的 GameObject 资源已正确放置在 Assets/Resources 文件夹下,并且在构建时被正确打包到应用程序中。
资源类型错误: 在使用 Resources.Load<T>() 方法加载资源时,需要确保传入的参数类型与实际加载资源的类型匹配。如果尝试加载的资源不是 GameObject 类型,会导致加载失败。
资源不存在或损坏: 如果实际资源不存在或损坏,也会导致加载错误。请检查资源是否存在、文件名是否正确以及资源是否完好。
资源引用丢失: 可能因为资源在 Unity 编辑器中的引用丢失,导致加载错误。检查资源在项目中的引用和关联是否正确。
我们按照可能性以及难易程度排序
资源引用丢失,不可能,因为不涉及到引用传递,
资源不存在或损坏,这个也排除,
那么就剩下三个,资源路径错误,资源未正确打包,资源类型错误。
很显然,检查的难易程度就是资源路径,打包两个检验差不多但都快于资源类型,这个排序的依据就是涉不涉及代码,以及代码涉不涉及反射相关,很显然,前两者都不涉及,那么一步一步开始检查
资源路径错误
这个最好排查,让群友把项目整个打包出来,下载之后对资源路径进行检查如图
很显然,路径是正确的,命名也是正确的,那么资源路径暂时排除(为什么暂时排除,原因就是文件的权限原因,有可能有的同学unity的权限不高,而文件又恰好在c盘的某些高权限文件夹下不对外开放的话是有可能无法加载的)
资源未正确打包
这个也很好确认我们重新制作一个预制体,然后放到对应路径中,并把原来的预制体加上-1,把新的预制体放上去重命名为原来的预制体名称,再次运行代码,同样报错,那么可以排除资源未正确打包。
类型错误
那么就剩下资源类型错误的问题了,说实话,当我检查到这个最不可能的情况的时候,我很慌,因为我真想不出来有什么方法可以让类型错误的
那么首先类型错误的检查方式很简单,只需要用到一个反射相关的但我们很常用的方法
Object.GetType();
这个方法可以返回一个类型给我们,而当我运行的时候unity返回了一个特别有意思的报错,空引用
怎么可能呢,应该返回一个UnityEngine.GameObject才对如图
所以,最开始的那段代码中和类型有关的只有GameObject了,那么经过查询我发现了一个以GameObject命名的脚本
好家伙,怪不得返回空类型,原来类型转成这个了,所以,在此提醒各位萌新们,在进unity写代码之前,了解一下命名规则,了解一下一些unity保留的字符吧,希望这个教程能帮到各位,争取下次不要出现用Button,Image之类命名的脚本了