Search code examples
c#unity-game-engineunity-webgl

Unity WebGL Simple JSON


I am trying to import text in my Unity script with WebGL but it seems like in WebGL, it is not able to find the JSON file itself. I have saved the file in StreamingAssets. How do I fix this?

using System.Collections;
using System.Collections.Generic;
using System.IO;
using SimpleJSON;
using UnityEngine;
using UnityEngine.UI;

public class ReadScene : MonoBehaviour {
    public string jsonFile;
    JSONNode itemsData;
    string path;

    public Text sceneText;

    // Start is called before the first frame update
    void Start () {

        path = Path.Combine (Application.streamingAssetsPath, "Settings.json");
        if (File.Exists (path)) {
            jsonFile = File.ReadAllText (path);
            DeserializePages ();
        } else {
            sceneText.gameObject.SetActive(false);
        }
    }


    public void DeserializePages () {
        itemsData = JSON.Parse (jsonFile);
        var parseJSON = JSON.Parse (jsonFile);

        sceneText.text = parseJSON["Scene01"].Value;

    }


}

Also I have tried to change the folder location to "Resources" and still facing the same issue.


Solution

  • From Application.streamingAssetsPath

    It is not possible to access the StreamingAssets folder on WebGL and Android platforms. No file access is available on WebGL. Android uses a compressed .apk file. These platforms return a URL. Use the UnityWebRequest class to access the Assets.

    tbh I don't even know right now whether this No file access is available on WebGL is just misleading or indeed means there is no way to access StreamingAssets. I will assume it is just formulated badly and just means you can not access any file/directory directly but you can still go through UnityWebRequest.Get like

    IEnumerator Start () 
    {
        sceneText.gameObject.SetActive(false);
    
        path = Path.Combine(Application.streamingAssetsPath, "Settings.json");
    
        using(var request = UnityWebRequest.Get(path))
        {
            yield return request.SendWebRequest();
    
            if(!request.result == UnityWebRequest.Result.Success)
            {
                Debug.LogError("Error: " + result.error);
                yield break;
            }
           
            jsonFile = webRequest.downloadHandler.text;
            DeserializePages();
        }
    }
    
    private void DeserializePages() 
    {
        itemsData = JSON.Parse (jsonFile);
    
        sceneText.text = itemsData["Scene01"].Value;
        sceneText.gameObject.SetActive(true);
    }