ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

【Unity开发】StreamingAssets、Assets Bundle、Resources区别对比

【Unity开发】StreamingAssets、Assets Bundle、Resources区别对比


🐾 个人主页 🐾
阿松爱睡觉,横竖醒不来
🏅你可以不屠龙,但不能不磨剑🗡

文章

  • 一、前言
  • 二、StreamingAssets文件夹
    • 1. 用途
    • 2. 访问方式
    • 3. 优点
    • 4. 缺点
  • 三、AssetBundle
    • 1. 用途
    • 2. 访问方式
    • 3. 优点
    • 4. 缺点
  • 四、Resources文件夹
    • 1. 用途
    • 2. 访问方式
    • 3. 优点
    • 4. 缺点
  • 五、总结
    • 一句话记忆
    • 如何选择?

一、前言

很多 Unity 初学者都会遇到一个困惑:StreamingAssets、AssetBundle、Resources 这三个文件夹到底有什么区别?它们都能存放资源,但用法和适用场景却大不相同。

简单打个比方:

  • Resources就像你随身背的小背包,东西少、拿取方便,但背的东西越多越累(打包体积变大)。
  • StreamingAssets就像仓库货架,东西直接摆在那里,随时能拿,但不会自动帮你整理(不参与打包)。
  • AssetBundle就像快递包裹,需要时再拆开取用,还能从外地寄过来(从服务器下载),适合大件和更新。

下面我们逐一详细讲解,并给出简单的代码示例,帮你彻底分清它们。

二、StreamingAssets文件夹

1. 用途

StreamingAssets 文件夹用于存储不需要打包的资源,比如音频、视频、数据库等大型文件。构建项目时,这些文件会被原样复制到构建目录中,运行时可以直接访问。

2. 访问方式

可以使用System.IO相关的类来读写文件,在移动平台上使用Application.streamingAssetsPath获取路径。

usingUnityEngine;usingSystem.IO;publicclassReadStreamingAssets:MonoBehaviour{voidStart(){// 获取 StreamingAssets 文件夹的路径stringpath=Path.Combine(Application.streamingAssetsPath,"data.txt");// 读取文件内容if(File.Exists(path)){stringcontent=File.ReadAllText(path);Debug.Log("读取到内容:"+content);}}}

3. 优点

  • 简单直接,不需要打包和解包。
  • 适合存储不需要加密或优化的文件。

4. 缺点

  • 文件会原样暴露在安装包中,容易被玩家修改。
  • 无法按需加载,所有文件都会占用安装包空间。

三、AssetBundle

1. 用途

AssetBundle 是一种打包和分发资源的机制。它可以把多个资源打包成一个文件,运行时按需动态加载,常用于大型游戏,减少初始加载时间。

2. 访问方式

使用AssetBundle.LoadFromFile或AssetBundle.LoadFromMemory加载,也可以从服务器下载后加载。

usingUnityEngine;publicclassLoadAssetBundle:MonoBehaviour{voidStart(){// 从本地文件加载 AssetBundleAssetBundlebundle=AssetBundle.LoadFromFile(Application.streamingAssetsPath+"/mybundle");if(bundle!=null){// 从 AssetBundle 中加载一个 GameObjectGameObjectprefab=bundle.LoadAsset<GameObject>("MyPrefab");Instantiate(prefab);// 使用完毕后卸载bundle.Unload(false);}}}

3. 优点

  • 可以按需加载资源,优化内存使用。
  • 支持热更新,可以从服务器下载新资源,无需重新发布游戏。

4. 缺点

  • 需要手动管理打包和加载流程,学习成本较高。
  • 需要处理依赖关系和版本管理,复杂度较高。

四、Resources文件夹

1. 用途

Resources 文件夹用于存储运行时动态加载的资源。构建项目时,这些资源会被自动打包到最终的构建文件中。

2. 访问方式

使用Resources.Load或Resources.LoadAll加载资源,使用Resources.UnloadAsset卸载资源。

usingUnityEngine;publicclassLoadResources:MonoBehaviour{voidStart(){// 从 Resources 文件夹加载一个预制体GameObjectprefab=Resources.Load<GameObject>("Prefabs/MyPrefab");Instantiate(prefab);}}

3. 优点

  • 简单易用,适合小型游戏或不需要频繁更新的资源。
  • 资源在构建时被打包,减少了运行时的文件访问。

4. 缺点

  • 所有 Resources 中的资源都会被打包,即使没用到也会占用空间。
  • 无法热更新,发布后不能单独替换资源。

五、总结

对比项StreamingAssetsAssetBundleResources
是否打包不打包,原样复制打包成独立文件自动打包进构建文件
加载方式文件系统直接读写按需动态加载Resources.Load
是否支持热更新支持(替换文件)支持(下载新包)不支持
适用场景音频、视频、数据库等大文件大型游戏、热更新小型游戏、固定资源
学习难度⭐⭐⭐⭐⭐

一句话记忆

  • StreamingAssets:仓库货架,直接放、直接拿,适合大文件。
  • AssetBundle:快递包裹,需要时拆开,还能远程寄送,适合热更新。
  • Resources:随身背包,方便但装不了太多,适合小项目。

如何选择?

  • 存大文件(视频、音频、数据库)→ 用StreamingAssets
  • 做大型游戏或需要热更新→ 用AssetBundle
  • 做小项目、资源固定不变 → 用Resources

希望这篇文章能帮你彻底分清这三个文件夹的区别,在实际开发中选对方案!


RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进