Unity技术问题:实例化资源时对象为空,如何排查路径问题?
解决Resources.Load返回null的实例化问题
咱们先拆解你遇到的核心问题:Resources.Load返回null导致实例化失败,结合你的场景,主要有几个关键坑需要修正,我一步步给你理清楚:
1. 资源必须放在Resources专属文件夹里
这是最容易忽略的规则!Unity的Resources.Load只能加载**直接放在Resources文件夹(或其子文件夹)**内的资源。你现在把Level.obj放在Assets/Objects下,这个路径不在Resources目录的检索范围内,Unity根本找不到它。
解决步骤:
- 在
Assets目录下新建一个名为Resources的文件夹(注意大小写必须完全匹配) - 把你的
Objects文件夹(或直接把Level.obj)移动到Resources文件夹中,最终路径变为Assets/Resources/Objects/Level.obj
2. .obj文件不能直接实例化,要先转成预制体(Prefab)
.obj是静态模型文件,直接用Instantiate实例化会出问题,而且Resources.Load加载原始模型的逻辑也不对。你需要先把它做成预制体:
- 把
Level.obj从Project窗口拖到Hierarchy窗口,生成一个场景临时对象 - 再把这个临时对象从Hierarchy拖回Project窗口的
Resources/Objects文件夹里,生成Level预制体 - 最后删除Hierarchy里的临时对象即可
3. 修正Resources.Load的路径参数
当预制体在Resources/Objects/Level路径下时,你需要写相对于Resources文件夹的相对路径,不需要加扩展名,也不能加Assets/前缀。另外你之前写的Object/Level少了一个s,这也是可能导致找不到的细节问题!
正确的路径写法是:Objects/Level
修正后的完整代码
我给你加了空值判断,方便你排查后续问题:
void Update() { if (Input.GetKeyDown(KeyCode.Space)) { GameObject levelPrefab = Resources.Load<GameObject>("Objects/Level"); if (levelPrefab != null) { Instantiate(levelPrefab, transform.position, Quaternion.identity); } else { Debug.LogError("找不到Level预制体,请检查路径和资源位置!"); } } }
调整完这些步骤,按下空格键应该就能正常生成对象了。另外提一句,Unity现在更推荐用Addressables或AssetBundles管理资源,不过小项目用Resources也完全够用~
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

