You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 16:39:00