Unity中如何加载指定文件夹下所有ScriptableObject组成数组
Unity Resources.LoadAll 无法加载ScriptableObject排查方案
你定义的ScriptableChar类本身写法没有语法问题:
[CreateAssetMenu(fileName = "New Char", menuName = "Char")] public class ScriptableChar : ScriptableObject { public string charName; public Sprite charSprite; public Sprite charBorderSprite; public CharClass charClass; }
你尝试过的两种加载写法里,非泛型和泛型的语法本身都是正确的:
public Object[] allCharacters = Resources.LoadAll("Cards");
void GetAllCharactersArray() { ScriptableChar[] allCharacters = Resources.LoadAll<ScriptableChar>("Cards"); Debug.Log("Characters: "+allCharacters.Length); }
加载返回空数组基本都是以下几个配置类问题,按顺序排查即可:
- 核心规则前置:
Resources.Load/LoadAll接口仅能识别存放在名为Resources的特殊文件夹内的资源,这是占比最高的故障原因。你要加载的Cards文件夹必须是Resources文件夹的子目录,合法路径示例:Assets/Resources/Cards/。如果Cards文件夹直接放在Assets根目录、或其他非Resources目录下,任何加载代码都会返回空。提示:项目内可以存在多个Resources文件夹,运行时会自动合并所有Resources目录下的资源,但不建议创建多份Resources目录,会增大应用启动时的资源初始化开销。
- 检查路径拼写:加载参数不需要带
.asset等文件后缀,也不需要写Assets/开头的全路径,如果Cards文件夹嵌套在Resources的子目录下,要写全相对路径,比如资源实际路径为Assets/Resources/GameConfig/Cards,加载参数就要传"GameConfig/Cards"。 - 检查资源类型匹配:点选Cards文件夹内的单个角色资产,查看Inspector面板顶部的类型标识,确认资产真的是
ScriptableChar类型,而非其他同名ScriptableObject类、预制体、文本文件等其他类型资源。如果之前改过ScriptableChar类的类名、命名空间,旧的资产会丢失类型引用,需要重新创建。 - 检查类的存放位置:
ScriptableChar类不能放在Editor文件夹下,否则运行时会找不到对应类型,导致泛型加载过滤不到对应资源。 - 检查AssetBundle配置:如果Cards下的资产被分配到了自定义AssetBundle包中,Resources接口无法读取这部分资源,需要通过AssetBundle加载接口获取。
可以先跑下面的测试代码定位具体问题:
void TestLoad() { // 先加载目标路径下所有类型的资源 Object[] allResInPath = Resources.LoadAll("Cards"); Debug.Log($"Cards路径下资源总数:{allResInPath.Length}"); foreach (Object res in allResInPath) { Debug.Log($"资源名:{res.name},资源类型:{res.GetType().FullName}"); } // 再过滤指定类型的资源 ScriptableChar[] allCharAssets = Resources.LoadAll<ScriptableChar>("Cards"); Debug.Log($"匹配ScriptableChar类型的资源数:{allCharAssets.Length}"); }
如果第一条日志输出为0,直接修正文件夹位置,把Cards移动到Resources目录下即可;如果第一条日志有数值、第二条为0,对照资源类型、类存放位置的排查项处理即可。
内容的提问来源于stack exchange,提问作者Kypindor
相关产品推荐
相关产品推荐

