当前位置: 首页 > news >正文

Unity StreamingAssets完全指南

一、基本概念

StreamingAssets是 Unity 中一个特殊的文件夹,位于Assets/StreamingAssets/。它的核心特点是:

📌打包时原样复制到最终应用中,不做任何压缩、加密或格式转换,可通过文件路径直接访问。


二、核心特性

特性说明
原样保留文件不会被 Unity 处理,保持原始格式
只读运行时只能读,不能写
平台差异不同平台访问方式不同(尤其是 Android)
不参与打包压缩会增加安装包体积
无引用检测Unity 不会追踪其中资源的引用关系

三、各平台路径

Unity 提供Application.streamingAssetsPath获取该目录路径:

平台实际路径
Editor / Standalone(PC/Mac)项目路径/Assets/StreamingAssets<exe>_Data/StreamingAssets
iOS<Application>/Data/Raw
Androidjar:file:///data/app/xxx.apk!/assets/⚠️ 在 APK 内部
WebGLURL/StreamingAssets

四、读取方式

1. PC / iOS / Editor(可直接用 File API)

stringpath=Path.Combine(Application.streamingAssetsPath,"config.json");stringcontent=File.ReadAllText(path);

2. Android(必须用 UnityWebRequest)⚠️

Android 上的 StreamingAssets 位于 APK 压缩包内,无法用 File API 直接读取,必须使用UnityWebRequest:

IEnumeratorLoadFromStreamingAssets(stringfileName){stringpath=Path.Combine(Application.streamingAssetsPath,fileName);#ifUNITY_ANDROID && !UNITY_EDITOR// Android 必须用 UnityWebRequest#elsepath="file://"+path;#endifUnityWebRequestrequest=UnityWebRequest.Get(path);yieldreturnrequest.SendWebRequest();if(request.result==UnityWebRequest.Result.Success){stringcontent=request.downloadHandler.text;Debug.Log(content);}}

3. 统一封装(推荐)

publicstaticclassStreamingAssetsReader{publicstaticIEnumeratorReadText(stringrelativePath,Action<string>onComplete){stringpath=Path.Combine(Application.streamingAssetsPath,relativePath);#if!UNITY_ANDROID || UNITY_EDITORpath="file://"+path;#endifusing(UnityWebRequestreq=UnityWebRequest.Get(path)){yieldreturnreq.SendWebRequest();if(req.result==UnityWebRequest.Result.Success)onComplete?.Invoke(req.downloadHandler.text);elseDebug.LogError($"读取失败:{req.error}");}}publicstaticIEnumeratorReadBytes(stringrelativePath,Action<byte[]>onComplete){stringpath=Path.Combine(Application.streamingAssetsPath,relativePath);#if!UNITY_ANDROID || UNITY_EDITORpath="file://"+path;#endifusing(UnityWebRequestreq=UnityWebRequest.Get(path)){yieldreturnreq.SendWebRequest();if(req.result==UnityWebRequest.Result.Success)onComplete?.Invoke(req.downloadHandler.data);}}}

五、典型应用场景

✅ 适合放的内容

  1. 游戏初始配置文件(JSON、XML、CSV)
  2. 首包 AssetBundle(热更新前的初始资源)
  3. 视频文件(播放前不需要处理)
  4. 数据库文件(如 SQLite 的.db,需先复制到可写目录)
  5. 第三方 SDK 配置文件

❌ 不适合放的内容

  • 需要频繁修改的数据(该目录只读)
  • Unity 需要识别的资源(如 prefab、材质等,应放 Assets 或 Resources)
  • 敏感数据(明文可被解压查看)

六、StreamingAssets vs 其他目录对比

对比项StreamingAssetsResourcespersistentDataPath
读写只读只读✅ 可读写
是否打包✅ 打入包体✅ 打入包体❌ 运行时生成
是否压缩❌ 原样保留✅ Unity 处理-
访问方式文件路径Resources.Load文件路径
Android 特殊✅ 需 WebRequest无特殊
典型用途首包 AB、配置少量常驻资源存档、热更资源

七、常见使用模式:首次启动复制到可写目录

由于 StreamingAssets只读,常见做法是首次启动时复制到persistentDataPath,之后从可写目录读取和更新:

IEnumeratorCopyToPersistent(stringfileName){stringsrcPath=Path.Combine(Application.streamingAssetsPath,fileName);stringdstPath=Path.Combine(Application.persistentDataPath,fileName);if(File.Exists(dstPath))yieldbreak;// 已复制过#if!UNITY_ANDROID || UNITY_EDITORsrcPath="file://"+srcPath;#endifusing(UnityWebRequestreq=UnityWebRequest.Get(srcPath)){yieldreturnreq.SendWebRequest();if(req.result==UnityWebRequest.Result.Success){File.WriteAllBytes(dstPath,req.downloadHandler.data);Debug.Log($"复制完成:{dstPath}");}}}

八、热更新架构中的典型作用

安装包首次启动: ┌─────────────────────┐ ┌──────────────────────┐ │ StreamingAssets │──复制→│ persistentDataPath │ │ (首包 AB + 版本号) │ │ (可写,支持更新) │ └─────────────────────┘ └──────────────────────┘ │ ↓ 远程 CDN 下载新版本 AB 覆盖 persistentDataPath

加载顺序:优先从persistentDataPath读取(热更后的资源),若无则回退到StreamingAssets(首包资源)。

stringGetABPath(stringabName){stringpersistentPath=Path.Combine(Application.persistentDataPath,abName);if(File.Exists(persistentPath))returnpersistentPath;// 热更资源优先returnPath.Combine(Application.streamingAssetsPath,abName);// 首包资源兜底}

九、注意事项 ⚠️

  1. Android 不能用 File.Exists 判断:APK 内文件用File.Exists会返回 false,需用UnityWebRequest尝试请求。
  2. 路径不要用反斜杠:统一用Path.Combine/
  3. 大文件谨慎放:直接影响安装包大小。
  4. Meta 文件不打包:.meta文件不会随资源打入包体。
  5. 子目录支持:可以任意建子目录,路径需一致。
  6. iOS 大小写敏感:注意文件名大小写。

十、常见问题 FAQ

Q1: 为什么 Android 上 File.ReadAllText 读不到?
A: APK 是压缩包,文件不在真实文件系统中,必须用 UnityWebRequest。

Q2: StreamingAssets 里的文件会被压缩加密吗?
A: 不会,原样保留,容易被解包查看,不要放敏感内容。

Q3: 可以运行时写入吗?
A: 不能,请写入Application.persistentDataPath

Q4: StreamingAssets 会打入 Resources 索引吗?
A: 不会,Unity 不会识别里面的资源。


http://www.jsqmd.com/news/1354931/

相关文章:

  • SEIRS+高级功能:测试、追踪与隔离干预模拟全攻略
  • SEIRS+网络模型进阶:接触网络结构对传播的影响分析
  • Picovoice快速入门:5分钟搭建你的第一个离线语音交互应用
  • Path of Building终极指南:流放之路Build规划神器完全解析
  • 2026年烤漆耐高温电镀银树脂供应厂家综合考察 - 优企名品
  • 2026年烤漆耐高温电镀银树脂供应厂家专业解析 - 卓企推荐
  • 王庙村布局,天道是规律而非人情
  • 抖掌柜实操|抖音小店一键铺货多店互搬怎么操作?AI违规检测能不能真正防止店铺限流 - 抖掌柜—键铺货
  • 揭秘国家建设部官方网站赵宏彦:深入解析其在行业转型中的真实角色与价值
  • Exchange Calendar与Thunderbird Lightning集成教程:打造高效办公平台
  • godef常见问题解决方案:从安装到使用的全面指南
  • 高定收口工艺深度解析:为什么说细节决定高端定制的品质? - 设计咖
  • 零基础入门RVC变声:10分钟打造你的专属AI声音
  • 无锡市江阴市GEO城市合伙人选型推荐哪家靠谱:源头技术、分润模式与区域保护一次看清 - 小随科技
  • 三阶段录屏革命:从即时分享到完全自主的数据控制方案
  • MAA助手Arknights v5.13.0技术实现机制与架构优化分析
  • 德阳打捞服务|潜水员水下作业服务电话-鸿腾水下打捞 - 企业官方推荐【认证】
  • Spoke性能优化:提升3D场景加载速度的10个实用技巧
  • Trellis安全最佳实践:保护你的AI协作数据与隐私
  • 新国展附近酒店怎么选?我亲测源庚国际酒店,参展出差都省心 - 优企甄选
  • 抖掌柜实操|抖音小店店群一键铺货多店互搬AI选品违规检测,零基础无货源矩阵起店高效玩法 - 抖掌柜—键铺货
  • 2026北京如何选对律师?推荐王兴华律师专办拆迁赔偿纠纷 - 优企甄选
  • 5分钟掌握开源屏幕录制工具:从零开始创建专业视频制作工作流
  • 3分钟快速瘦身:Win11Debloat让你的Windows系统重获新生的完整指南
  • TheRock未来路线图:即将发布的7大特性深度解析
  • 告别枯燥终端交互!Laravel Prompts实现浏览器级用户体验的秘诀
  • 探索Ookii.Dialogs.WinForms核心组件:TaskDialog与ProgressDialog实战
  • 2026 杭州本地犬舍,从售后履约能力筛选放心繁育基地 - 城刊速递
  • 云南旅行社怎么选?从预算到体验,看懂这几点再出发 - 优企甄选
  • 2026企业厂房拆迁维权推荐:北京京云律师事务所解析与选择指引 - 优企甄选