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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 11:35:22