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

Application.streamingAssetsPath and WebGL build


In a project I'm working on I have two json files in the StreamingAssets directory. The script that handles them works perfectly in a Standalone PC build but doesn't work at all in a WebGL one.

I'm getting the "Cannot find file!" message according to the script:

    else if (!File.Exists (filePath))
    {
        Debug.LogError ("Cannot find file!"); 
    }

I was given the answer to use the WWW class as described in the scripting API on Unity Technologies site at this address: https://docs.unity3d.com/ScriptReference/Application-streamingAssetsPath.html

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    public string filePath = System.IO.Path.Combine(Application.streamingAssetsPath, "MyFile");
    public string result = "";
    IEnumerator Example() {
        if (filePath.Contains("://")) {
            WWW www = new WWW(filePath);
            yield return www;
            result = www.text;
        } else
            result = System.IO.File.ReadAllText(filePath);
    }
}

I would gladly do that but I'm too new at coding and I need some explanations. The first question I have for now is: what is this "my file" string in the line

    public string filePath = System.IO.Path.Combine(Application.streamingAssetsPath, "MyFile");

What am I supposed to write there? Is it a url? And if it is a url, the url of what?

I would be very grateful is someone could hold my hand and guide me into understanding this! Thank you!

(This is my first question here; I hope I haven't made mistakes as I don't know how this place works yet.)


Solution

  • The first question I have for now is: what is this "my file" string in the line

    That's supposed to be the name of the file.Although, it is missing it's extension name. You should add that. For example, .txt, .jpg, png....

    What am I supposed to write there? Is it a url? And if it is a url, the url of what?

    You are just supposed to write the name of the file with the extension name where "MyFile" is.

    Example uses:

    In your Project, you create a folder called "StreamingAssets".

    Let's say that you have a file named "Anne.txt", and the file is inside the "StreamingAssets". folder, this should be your path:

    public string filePath = System.IO.Path.Combine(Application.streamingAssetsPath, "Anne.txt");
    

    Now let's say that the "Anne.txt" folder is placed in a folder called "Data" which is then in the "StreamingAssets" folder, it should look like this: "StreamingAssets/Data/Anne.txt".

    Your path should be:

    public string filePath = System.IO.Path.Combine(Application.streamingAssetsPath, "Data");
    filePath = System.IO.Path.Combine(filePath , "Anne.txt");
    

    That's it. Nothing complicated here. You then use that path string with WWW.

    Also your if (filePath.Contains("://")) should be if (filePath.Contains ("://") || filePath.Contains (":///")).

    EDIT

    If you have multiple files you want to load, I simplified that function into this so that it takes the file name as parameter.

    IEnumerator loadStreamingAsset(string fileName)
    {
        string filePath = System.IO.Path.Combine(Application.streamingAssetsPath, fileName);
    
        string result;
        if (filePath.Contains("://") || filePath.Contains(":///"))
        {
            WWW www = new WWW(filePath);
            yield return www;
            result = www.text;
        }
        else
            result = System.IO.File.ReadAllText(filePath);
    }
    

    Now, let's say that you have 3 files called "Anne.txt", "AnotherAnne.txt" and "OtherAnne.txt" placed in the "StreamingAssets" folder, you can load them with the code below:

    StartCoroutine(loadStreamingAsset("Anne.txt"));
    
    StartCoroutine(loadStreamingAsset("AnotherAnne.txt"));
    
    StartCoroutine(loadStreamingAsset("OtherAnne.txt"));