Unity打包iOS/Android端无法读取StreamingAssets内文件问题咨询
核心问题根源
硬编码单平台路径、使用仅支持桌面端的文件读取接口是这类问题的主要诱因,移动端StreamingAssets路径的访问规则和桌面端存在本质差异,不能直接套用桌面端的读取逻辑。
统一使用官方路径常量,禁止手动拼接平台前缀
不要手动写jar:file://、/Raw这类平台专属路径前缀,直接调用Unity内置的Application.streamingAssetsPath常量即可,该常量会根据当前运行平台自动返回合规的路径地址,手动拼接很容易因Unity版本迭代、系统版本差异出现路径格式错误。
路径拼接时统一用Path.Combine(Application.streamingAssetsPath, "source.txt")生成最终地址,避免手动拼接斜杠出现多写、漏写斜杠的问题。注意:iOS文件系统大小写敏感,必须严格核对
StreamingAssets文件夹名、文件名的大小写,拼写错误会直接导致文件找不到。按平台适配读取接口,不要全平台复用File类读取
不同平台对StreamingAssets的访问支持存在差异,直接用C#原生File类、File.Exists()方法在移动端大概率失效:- 编辑器、Windows/Mac/Linux桌面端:
Application.streamingAssetsPath指向文件系统内的真实目录,支持直接用File.ReadAllText()、FileStream等原生接口同步读取,也支持File.Exists()判断文件是否存在 - Android、iOS端:StreamingAssets内的文件会被压缩进安装包(Android为jar包内的assets目录、iOS为安装包内的Raw目录),不存在于公开文件系统路径下,不支持原生File类直接读取,也不支持File.Exists()判断,必须通过
UnityWebRequest协程异步读取。
移动端通用读取代码示例:
- 编辑器、Windows/Mac/Linux桌面端:
using UnityEngine; using UnityEngine.Networking; using System.IO; using System.Collections; public class LoadStreamingTxt : MonoBehaviour { void Start() { StartCoroutine(ReadSourceTxt()); } IEnumerator ReadSourceTxt() { string targetPath = Path.Combine(Application.streamingAssetsPath, "source.txt"); UnityWebRequest req = UnityWebRequest.Get(targetPath); yield return req.SendWebRequest(); if (req.result == UnityWebRequest.Result.Success) { string fileContent = req.downloadHandler.text; // 拿到文本内容后执行后续业务逻辑 Debug.Log($"读取成功,内容长度:{fileContent.Length}"); } else { Debug.LogError($"读取失败,路径:{targetPath},错误信息:{req.error}"); } } }
排查打包配置类问题
- 选中Project面板内的
source.txt文件,在Inspector面板检查平台导入设置,确认Android、iOS平台都勾选了「Include」选项,避免打包时文件被排除 - 确认
StreamingAssets文件夹直接放置在Assets目录根路径下,不要嵌套在其他资源文件夹内,文件夹名拼写完全正确(不要写成StreamingAsset、streamingassets这类错误命名) - 测试阶段先关闭Player Settings内的「Split Application Binary」(应用分包)选项,该选项开启后StreamingAssets文件会被打入OBB扩展包,若OBB未正确放置到设备指定目录也会出现读取失败问题,确认读取正常后再按需开启分包配置。
- 选中Project面板内的
长期稳定方案:首次启动复制到可读写路径
StreamingAssets为只读路径,打包后无法修改其中内容。如果后续存在修改txt内容的需求,可在应用第一次启动时,将StreamingAssets内的源文件复制到Application.persistentDataPath目录下——该目录全平台支持原生File类读写、不存在压缩包访问限制,后续所有读写操作都针对该目录下的文件即可,彻底规避跨平台路径兼容问题。
内容的提问来源于stack exchange,提问作者shesh

