在 Unity 中,Resources 和 StreamingAssets 是两个预定义的特殊文件夹,核心作用都是存放「运行时需要动态加载的资源」,但二者的设计逻辑、资源处理方式、使用场景差异极大。下面先分别拆解,再对比联系与区别。
一、核心定义与特性

  1. Resources 文件夹
    本质:Unity 内置的「序列化资源目录」,名称必须严格为 Resources(大小写敏感),可在 Assets 下创建多个(如 Assets/Resources、Assets/UI/Resources),加载时均视为根目录。
    资源处理:
    文件夹内的所有资源会被 Unity 序列化、压缩(默认 LZMA,可在 PlayerSettings 调整)、建立索引;
    即使代码未直接引用,也会被打包到游戏主包中(增加主包体积)。
    加载方式:通过 Resources.Load(“相对路径”) 加载(路径无需写 Resources 根目录,也无需文件后缀),例如:
csharp
运行
// 加载 Assets/Resources/UI/Button.prefab
GameObject btn = Resources.Load<GameObject>("UI/Button");

关键限制:
运行时只读,无法修改或写入;
不支持热更新(资源打包进主包,无法单独替换);
卸载需手动调用 Resources.UnloadUnusedAssets()(易引发内存碎片,需谨慎);
Unity 官方不推荐大规模使用(建议用 Addressables/AssetBundle 替代)。
2. StreamingAssets 文件夹
本质:Unity 预留的「原始资源目录」,名称必须严格为 StreamingAssets(大小写敏感),仅能有一个(Assets/StreamingAssets)。
资源处理:
文件夹内的资源完全不压缩、不序列化、不做任何处理,以「原始文件格式」原封不动打包到安装包;
不会被 Unity 索引,仅作为文件存储。
加载方式:无法用 Resources.Load,需通过「文件 IO / 网络请求」加载,且不同平台路径不同(需用 Application.streamingAssetsPath 获取路径),例如:

csharp
运行
// 跨平台加载 StreamingAssets 下的 config.json
IEnumerator LoadConfig()
{
    string path = Path.Combine(Application.streamingAssetsPath, "config.json");
    // Android 平台需用 UnityWebRequest(APK 内无法直接 File 访问),其他平台可 File/UnityWebRequest
    if (Application.platform == RuntimePlatform.Android)
    {
        using (UnityWebRequest req = UnityWebRequest.Get(path))
        {
            yield return req.SendWebRequest();
            string content = req.downloadHandler.text;
        }
    }
    else
    {
        string content = File.ReadAllText(path);
    }
}

关键特点:
运行时只读(Android/iOS 平台安装包内的文件无法写入,需复制到 PersistentDataPath 后修改);
支持热更新(可将 AssetBundle 放在此目录,运行时从服务器下载新版本替换);
适合存放「无需 Unity 序列化的原始文件」(如视频、音频、配置文件、AssetBundle 包)。
二、联系与核心区别

  1. 联系(共同点)
    都是 Unity 预定义的特殊文件夹,名称固定,Unity 会识别并特殊处理;
    均用于「运行时动态加载资源」(区别于直接拖到场景 / 预制体的静态引用);
    资源都会被打包到游戏安装包内(区别于 PersistentDataPath(运行时持久化目录)、TemporaryCachePath(临时目录));
    运行时均为「只读」(无法直接写入,需复制到可写目录)。
  2. 核心区别(表格对比)
    特性 Resources 文件夹 StreamingAssets 文件夹
    资源处理 序列化、压缩、建立索引 原始格式、不压缩、无索引
    加载方式 Resources.Load() 简单加载 需 File IO/UnityWebRequest 加载
    平台路径 无需关心(Unity 内部索引) 需通过 Application.streamingAssetsPath 获取
    热更新支持 不支持(打包进主包,无法替换) 支持(可作为 AssetBundle 初始目录)
    主包体积影响 增加主包体积(无法拆分) 可拆分(AssetBundle 独立包),但原始文件体积更大
    适用资源类型 小型、静态、无需热更的资源(如 UI 图标、小音效) 大型、原始格式、需热更的资源(如视频、配置文件、AssetBundle)
    Unity 官方建议 尽量避免使用(推荐 Addressables) 常用作原始文件 / AssetBundle 存储
    三、典型使用场景
  3. Resources 适用场景
    快速原型开发(无需配置路径,加载简单);
    小型项目、无热更需求的静态资源(如固定的 UI 图标、本地音效);
    临时测试资源(上线前建议替换为 AssetBundle/Addressables)。
  4. StreamingAssets 适用场景
    存放 AssetBundle 包(作为热更的初始资源);
    存放原始格式文件(如 MP4 视频、JSON/XML 配置文件、大型音频文件);
    需保留原始格式的资源(如自定义加密的文件,Unity 不处理则不会破坏加密格式)。
    四、易错点提醒
    Resources 文件夹可创建多个,但加载时均视为根目录(如 Assets/Resources/A.prefab 和 Assets/UI/Resources/A.prefab 会冲突);
    Android 平台的 StreamingAssets 资源存放在 APK 的 assets 目录下,无法用 System.IO.File 访问,必须用 UnityWebRequest;
    两者均无法运行时写入,如需修改 / 保存文件,需将资源复制到 Application.persistentDataPath(持久化目录,跨平台可写)。
    总结
    核心差异:Resources 是「Unity 管理的序列化资源池」,加载简单但不灵活、不支持热更;StreamingAssets 是「原始文件存储目录」,加载稍复杂但支持热更、适合原始格式资源。
    选型原则:小型静态资源临时用 Resources,正式项目优先用 StreamingAssets + AssetBundle/Addressables 实现热更和资源拆分。

更多推荐