尧图精选

Unity开发 资源加载问题:Resources.Load 返回 null?新手先查文件夹名和路径写法

🕒 发布时间:2026/11/6 3:44:09 📁 来源:尧图网络
大家好我是 SiKi老师。刚学 Unity 动态加载资源时很多同学会写一行Resources.Load运行后拿到的却是null后面一用这个变量就出错。资源明明就在工程里名字也没拼错到底哪里不对先别急着怀疑引擎。官方 Scripting API 写得很直接找得到就返回资源找不到就返回 null。所以排查思路只有一条让 Unity “找得到”。本文按 Unity 6 官方手册和脚本 API页面版本 6000.0并对照 6000.3 同名页面整理未附编辑器截图也不谈加载速度这类需要实机测量的数据。一 现象一行代码拿到的是 null典型写法是这样的资源放在Assets/Resources/Enemies/Slime.prefabusingUnityEngine;publicclassSpawnSlime:MonoBehaviour{voidStart(){GameObjectprefabResources.LoadGameObject(Enemies/Slime);if(prefabnull){Debug.LogWarning(没找到 Enemies/Slime先查文件夹名、路径写法和资源类型);return;}Instantiate(prefab);}}建议新手一开始就加上这个null判断。官方手册在介绍 Resources 系统的局限时也提到代码按字符串加载、而资源缺失时Resources.Load返回 null 并变成运行时错误需要你自己记清楚哪些资源要用。加了判断至少能在第一时间看到“是这一行没加载到”而不是在后面莫名其妙地报错。二 第一步查文件夹——资源必须放在名叫 Resources 的文件夹里Resources.Load只会去一种地方找Assets 文件夹里面、名字叫 Resources 的文件夹。官方原意是路径相对于项目 Assets 里任意一个名为 Resources 的文件夹。逐条对照文件夹名是不是Resources少写一个 s 的Resource、拼成Resourses都不是 Resources 文件夹。名字建议就照官方写法Resources。这个文件夹是不是在Assets里面放在 Assets 外面的不算。可以有多个 Resources 文件夹比如Assets/Resources/和Assets/Guns/Resources/同时存在这是官方举的例子都能用。有多个 Resources 文件夹时不要在里面放同名资源官方明确说不能重复使用同一个资源名。三 第二步查路径写法——相对 Resources不带扩展名用正斜杠文件夹对了再看传进去的字符串。官方 API 页对路径有四条要求正好对应新手最常见的四种写错你写的路径问题改成Assets/Resources/Enemies/Slime路径应该相对 Resources 文件夹不用写 Assets 和 ResourcesEnemies/SlimeEnemies/Slime.prefab路径不能带文件扩展名Enemies/SlimeEnemies\\SlimeUnity 的资源路径用正斜杠反斜杠不行Enemies/SlimeSlime资源其实在 Enemies 子文件夹里Resources 下面的子文件夹要写进路径Enemies/Slime官方给的两个例子很好记Assets/Guns/Resources/Shotgun.prefab只需要写ShotgunAssets/Resources/Guns/Missiles/PlasmaGun.prefab要写Guns/Missiles/PlasmaGun。也就是说从 Resources 文件夹的下一层开始写写到文件名为止去掉扩展名。另外官方说明这个路径不区分大小写所以enemies/slime和Enemies/Slime不是导致 null 的原因不必在大小写上反复折腾。四 第三步查类型——你要的类型和资源对不上也会返回 nullResources.LoadT(path)和Resources.Load(path, typeof(T))都带类型过滤。官方说明只有路径找得到、并且类型匹配时才返回资源否则返回 null。所以下面这种情况也会拿到 null资源是一个预制体你却写了Resources.LoadAudioClip(Enemies/Slime)。检查办法很朴素——在 Project 窗口里确认这个资源到底是什么类型再把T写成对应的类型。还有一个和类型有关的坑如果同一路径下有名字相同、类型不同的几个资源比如一张图和一个预制体都叫 Slime又没指定类型官方说返回哪一个是不确定的。这时请用Resources.LoadT(path)明确告诉 Unity 你要哪一种。五 一张排查清单以及这个方法的边界遇到Resources.Load返回 null按顺序查资源所在的文件夹名字是不是Resources是不是在Assets里面。路径是否从 Resources 下一层写起没写Assets/、Resources/。路径是否去掉了.prefab、.png这类扩展名。是否全用正斜杠/子文件夹有没有写全。T的类型是否和资源真实类型一致同名不同类型时是否指定了类型。多个 Resources 文件夹里有没有同名资源。我写了一个小的 Python 自检脚本把上面第 2、3、4 条做成路径检查用官方页里的例子和几种自拟错误写法跑过一遍Python 3.12.15 与 3.13.5 均通过。它只检查字符串写法不能代替 Unity 本身资源到底在不在、类型是什么还是要回到编辑器里看。边界说明官方手册也提醒Resources 文件夹里的资源无论用没用到都会被打进构建资源多了会拖慢构建和启动官方更推荐用 Addressables 管理复杂的资源集合。本文只解决“为什么返回 null”不讨论要不要继续用 Resources也不给任何速度或体积数字。依据Unity 6 脚本 API Resources.Load 页与手册 Introduction to the Resources system 页docs.unity.com 引擎文档 6000.0 版2026-11-04 核对6000.3 同名页说法一致。你这次拿到 null最后查出来是文件夹名写错还是路径里多写了Assets/或扩展名欢迎在评论区说说你踩的是哪一个。本系列下一篇讲 Unity 的 PlayerPrefs 存的数据到底保存在电脑哪里。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →