Unity打包Android后无法读取StreamingAssets目录下JSON文件问题求助
Unity安卓端StreamingAssets目录JSON文件读取失败解决方案
问题根本原因
- Android平台下
Application.streamingAssetsPath返回的是jar:file://开头的URI路径,不属于本地文件系统的可直接访问路径,普通System.IO类的文件读写API无法识别该格式路径,因此无论怎么拼接路径都无法直接读取。 - 你之前使用
Path.Combine时的写法存在错误:第二个参数"/playerData.json"带有前导斜杠,Path.Combine遇到根路径开头的参数时会直接忽略前面拼接的路径,返回第二个参数本身,进一步导致路径错误。 - StreamingAssets目录在Android平台为只读目录,仅支持读取操作,无法写入修改内容。
解决方案
方案1:仅需要读取JSON文件(无需修改)
直接使用Unity官方跨平台兼容的UnityWebRequest读取StreamingAssets下的文件,代码示例:
using UnityEngine; using UnityEngine.Networking; using System.Collections; public class ReadStreamingJson : MonoBehaviour { void Start() { StartCoroutine(LoadPlayerData()); } IEnumerator LoadPlayerData() { // 拼接路径时第二个参数不要带前导斜杠 string path = System.IO.Path.Combine(Application.streamingAssetsPath, "playerData.json"); using (UnityWebRequest request = UnityWebRequest.Get(path)) { yield return request.SendWebRequest(); if (request.result == UnityWebRequest.Result.Success) { string jsonContent = request.downloadHandler.text; // 此处可对jsonContent进行反序列化处理 Debug.Log(jsonContent); } else { Debug.LogError("读取失败:" + request.error); } } } }
方案2:需要修改写入JSON文件
因为StreamingAssets目录在安卓端只读,需要首次启动时将默认JSON文件复制到可读写的Application.persistentDataPath目录,后续所有读写操作都针对该目录下的文件进行,代码示例:
using UnityEngine; using UnityEngine.Networking; using System.Collections; using System.IO; public class JsonDataManager : MonoBehaviour { // 持久化目录下的JSON文件路径,后续所有读写都用这个路径 private string _persistentJsonPath = Path.Combine(Application.persistentDataPath, "playerData.json"); void Start() { // 持久化目录不存在配置文件时,先从StreamingAssets复制默认配置 if (!File.Exists(_persistentJsonPath)) { StartCoroutine(CopyDefaultConfig()); } else { LoadPlayerData(); } } IEnumerator CopyDefaultConfig() { string streamingPath = Path.Combine(Application.streamingAssetsPath, "playerData.json"); using (UnityWebRequest request = UnityWebRequest.Get(streamingPath)) { yield return request.SendWebRequest(); if (request.result == UnityWebRequest.Result.Success) { // 将读取到的默认配置写入持久化目录 File.WriteAllText(_persistentJsonPath, request.downloadHandler.text); Debug.Log("默认配置已复制到持久化目录"); LoadPlayerData(); } else { Debug.LogError("默认配置复制失败:" + request.error); } } } // 读取玩家数据 public void LoadPlayerData() { string jsonContent = File.ReadAllText(_persistentJsonPath); // 反序列化处理逻辑 Debug.Log("读取到的玩家数据:" + jsonContent); } // 保存玩家数据 public void SavePlayerData(object playerData) { string jsonContent = JsonUtility.ToJson(playerData); File.WriteAllText(_persistentJsonPath, jsonContent); Debug.Log("玩家数据已保存"); } }
内容的提问来源于stack exchange,提问作者qwdza54
相关产品推荐
相关产品推荐

