如何在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




