Unity WebGL无法读取JSON文件如何解决?文件存于StreamingAssets/Resources
Unity WebGL读取JSON文件失败的解决方案
WebGL环境下无法使用System.IO.File类直接访问本地文件(包括StreamingAssets和Resources目录),因为WebGL运行在浏览器沙箱中,文件系统访问机制和桌面平台不同:
Application.streamingAssetsPath在WebGL中是一个HTTP URL,而非本地文件路径,因此File.Exists()和File.ReadAllText()都会返回失败。- Resources目录的文件会被打包进游戏包,同样不能通过File类访问,必须用Unity的资源加载API。
方案1:通过UnityWebRequest读取StreamingAssets中的JSON
WebGL中读取StreamingAssets必须用异步网络请求,修改代码为协程实现:
using System.Collections; using System.Collections.Generic; using SimpleJSON; using UnityEngine; using UnityEngine.UI; using UnityEngine.Networking; public class ReadScene : MonoBehaviour { public Text sceneText; JSONNode itemsData; void Start () { StartCoroutine(LoadStreamingAssetsJSON()); } IEnumerator LoadStreamingAssetsJSON() { string url = Path.Combine(Application.streamingAssetsPath, "Settings.json"); using (UnityWebRequest request = UnityWebRequest.Get(url)) { yield return request.SendWebRequest(); if (request.result == UnityWebRequest.Result.Success) { string jsonFile = request.downloadHandler.text; DeserializePages(jsonFile); } else { sceneText.gameObject.SetActive(false); Debug.LogError("加载JSON失败: " + request.error); } } } void DeserializePages(string jsonContent) { itemsData = JSON.Parse(jsonContent); var parseJSON = JSON.Parse(jsonContent); sceneText.text = parseJSON["Scene01"].Value; } }
方案2:通过Resources目录加载JSON
如果JSON文件较小,可以将其放入Resources目录(需手动创建该目录),然后用Resources.Load<TextAsset>加载:
注意:放入Resources的文件,加载时不需要带.json后缀,且文件会被打包进游戏包,无法在运行时修改。
修改代码如下:
using System.Collections; using System.Collections; using SimpleJSON; using UnityEngine; using UnityEngine.UI; public class ReadScene : MonoBehaviour { public Text sceneText; JSONNode itemsData; void Start () { LoadResourcesJSON(); } void LoadResourcesJSON() { // 加载Resources目录下的Settings.json文件,路径不带后缀 TextAsset jsonAsset = Resources.Load<TextAsset>("Settings"); if (jsonAsset != null) { string jsonFile = jsonAsset.text; DeserializePages(jsonFile); } else { sceneText.gameObject.SetActive(false); Debug.LogError("Resources中未找到Settings.json文件"); } } void DeserializePages(string jsonContent) { itemsData = JSON.Parse(jsonContent); var parseJSON = JSON.Parse(jsonContent); sceneText.text = parseJSON["Scene01"].Value; } }
额外注意事项
- 确保JSON文件的导入设置:在Unity Inspector中,将JSON文件的
Import Type设置为TextAsset(默认可能已经是,但需确认)。 - WebGL构建时,StreamingAssets目录下的文件会被复制到构建输出的
StreamingAssets文件夹中,确保构建时该文件被正确包含。 - 如果使用SimpleJSON库,确保该库已正确导入到项目中,无编译错误。
内容的提问来源于stack exchange,提问作者Brantly
相关产品推荐
相关产品推荐

