You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Android平台从Unity的StreamingAssets读取JSON文件?

Android平台下Unity读取StreamingAssets中JSON文件的解决方案

Hey there! 我看到你已经搞定了iOS和Unity Editor下读取StreamingAssets里JSON的逻辑,现在要适配Android对吧?这里得提醒你一个关键差异:Android平台的StreamingAssets文件是打包在APK压缩包内部的,不能直接用File.ReadAllText来读取——普通的文件系统访问方式在这儿行不通。

下面给你一套跨平台的解决方案,完美兼容Android、iOS和Editor,而且用了Unity官方推荐的异步读取方式,避免卡帧:

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
using System.IO;

public class JsonReader : MonoBehaviour
{
    private Main itemsContent;
    private string bundleForPing;

    // 推荐用协程异步读取,避免阻塞主线程
    public IEnumerator ReadJsonCoroutine()
    {
        // 用Unity提供的跨平台路径API,自动适配不同平台的StreamingAssets位置
        string jsonPath = Path.Combine(Application.streamingAssetsPath, "elements.json");
        
        if (Application.platform == RuntimePlatform.Android)
        {
            // Android平台必须用UnityWebRequest读取APK内的资源
            using (UnityWebRequest www = UnityWebRequest.Get(jsonPath))
            {
                yield return www.SendWebRequest();

                if (www.result != UnityWebRequest.Result.Success)
                {
                    Debug.LogError($"读取JSON失败: {www.error}");
                }
                else
                {
                    ParseJsonContent(www.downloadHandler.text);
                }
            }
        }
        else
        {
            // iOS和Editor平台可以直接用File类读取
            string json = File.ReadAllText(jsonPath);
            ParseJsonContent(json);
        }
    }

    // 把解析逻辑抽出来,复用代码
    private void ParseJsonContent(string json)
    {
        itemsContent = JsonUtility.FromJson<Main>(json);
        bundleForPing = itemsContent.bundleID;
        Debug.Log($"成功读取bundleID: {bundleForPing}");
    }

    // 可以在游戏启动时调用这个协程
    private void Start()
    {
        StartCoroutine(ReadJsonCoroutine());
    }
}

几个关键细节说明:

  • Application.streamingAssetsPath:这是Unity提供的跨平台路径工具,会自动返回对应平台的StreamingAssets目录路径,比你之前手动拼接Application.dataPath更可靠,不用再写平台宏判断路径了。
  • Android的异步读取:因为APK是压缩包,必须通过Unity的网络请求API来读取内部资源,UnityWebRequest是目前官方推荐的方案(替代旧的WWW类),而且用协程处理异步操作不会阻塞主线程,避免游戏卡顿。
  • 错误处理:代码里加了错误日志输出,方便你调试时排查读取失败的问题(比如文件路径写错、文件不存在等)。

如果你用的是比较旧的Unity版本(2017及以前),UnityWebRequest可能还没成为主流,那可以替换成WWW类,逻辑类似:

// Android平台用WWW的写法(旧版本兼容)
using (WWW www = new WWW(jsonPath))
{
    yield return www;
    if (!string.IsNullOrEmpty(www.error))
    {
        Debug.LogError($"读取JSON失败: {www.error}");
    }
    else
    {
        ParseJsonContent(www.text);
    }
}

内容的提问来源于stack exchange,提问作者Abs3akt

火山引擎 最新活动