Using Resources Folder in Unity
Asked Answered
M

3

19

I have am developing a HoloLens project that needs to reference .txt files. I have the files stored in Unity's 'Resources' folder and have them working perfectly fine (when run via Unity):

string basePath = Application.dataPath;
string metadataPath = String.Format(@"\Resources\...\metadata.txt", list);

// If metadata exists, set title and introduction strings.
if (File.Exists(basePath + metadataPath))
{
      using (StreamReader sr = new StreamReader(new FileStream(basePath + metadataPath, FileMode.Open)))
    {
         ...
    }
}

However, when building the program for HoloLens deployment, I am able to run the code but it doesn't work. None of the resources show up and when examining the HoloLens Visual Studio solution (created by selecting build in Unity), I don't even see a resources or assets folder. I am wondering if I am doing something wrong or if there was a special way to deal with such resources.

Also with image and sound files...

foreach (string str in im)
{
      spriteList.Add(Resources.Load<Sprite>(str));
}

The string 'str' is valid; it works absolutely fine with Unity. However, again, it's not loading anything when running through the HoloLens.

Mutiny answered 26/12, 2016 at 3:46 Comment(0)
S
43

You can't read the Resources directory with the StreamReader or the File class. You must use Resources.Load.

1.The path is relative to any Resources folder inside the Assets folder of your project.

2.Do not include the file extension names such as .txt, .png, .mp3 in the path parameter.

3.Use forward slashes instead of back slashes when you have another folder inside the Resources folder. backslashes won't work.

Text files:

TextAsset txtAsset = (TextAsset)Resources.Load("textfile", typeof(TextAsset));
string tileFile = txtAsset.text;

Supported TextAsset formats:

txt .html .htm .xml .bytes .json .csv .yaml .fnt

Sound files:

AudioClip audio = Resources.Load("soundFile", typeof(AudioClip)) as AudioClip;

Image files:

Texture2D texture = Resources.Load("textureFile", typeof(Texture2D)) as Texture2D;

Sprites - Single:

Image with Texture Type set to Sprite (2D and UI) and

Image with Sprite Mode set to Single.

Sprite sprite = Resources.Load("spriteFile", typeof(Sprite)) as Sprite;

Sprites - Multiple:

Image with Texture Type set to Sprite (2D and UI) and

Image with Sprite Mode set to Multiple.

Sprite[] sprite = Resources.LoadAll<Sprite>("spriteFile") as Sprite[];

Video files (Unity >= 5.6):

VideoClip video = Resources.Load("videoFile", typeof(VideoClip)) as VideoClip;

GameObject Prefab:

GameObject prefab = Resources.Load("shipPrefab", typeof(GameObject)) as GameObject;

3D Mesh (such as FBX files)

Mesh model = Resources.Load("yourModelFileName", typeof(Mesh)) as Mesh;

3D Mesh (from GameObject Prefab)

MeshFilter modelFromGameObject = Resources.Load("yourGameObject", typeof(MeshFilter)) as MeshFilter;
Mesh loadedMesh = modelFromGameObject.sharedMesh; //Or   design.mesh

3D Model (as GameObject)

GameObject loadedObj = Resources.Load("yourGameObject") as GameObject;
//MeshFilter meshFilter = loadedObj.GetComponent<MeshFilter>();
//Mesh loadedMesh = meshFilter.sharedMesh;

GameObject object1 = Instantiate(loadedObj) as GameObject;

Accessing files in a sub-folder:

For example, if you have a shoot.mp3 file which is in a sub-folder called "Sound" that is placed in the Resources folder, you use the forward slash:

AudioClip audio = Resources.Load("Sound/shoot", typeof(AudioClip)) as AudioClip;

Asynchronous Loading:

IEnumerator loadFromResourcesFolder()
{
    //Request data to be loaded
    ResourceRequest loadAsync = Resources.LoadAsync("shipPrefab", typeof(GameObject));

    //Wait till we are done loading
    while (!loadAsync.isDone)
    {
        Debug.Log("Load Progress: " + loadAsync.progress);
        yield return null;
    }

    //Get the loaded data
    GameObject prefab = loadAsync.asset as GameObject;
}

To use: StartCoroutine(loadFromResourcesFolder());

Subdual answered 26/12, 2016 at 3:54 Comment(3)
I see, that makes sense. Then my next part would be that I also have image and sound files (in resources) that I am using resources.load to retrieve. Those work in Unity but not when I deploy to the HoloLens either.Mutiny
I've answered many of these questions about Resources folder and one few hours ago and most of them with the-same answer but different problem in title or description. I've decided to put together a solution that will cover most of this problems and file types to prevent providing duplicate answer in the future. Check my edit and let me know if you have a question.Subdual
This is a practical and complete reference for resources which I have been looking for :-)Vouge
E
0

If you want to load text file from resource please do not specify file extension just simply follow the below given code

private void Start()
{
    TextAsset t = Resources.Load<TextAsset>("textFileName");
    List<string> lines = new List<string>(t.text.Split('\n'));
    foreach (string line in lines)
    {
        Debug.Log(line);
    }
}

debug.Log can print all the data that are available in text file

Ezechiel answered 2/6, 2021 at 10:10 Comment(0)
B
0

You can try to store your text files in streamingsasset folder. It works fine in my project

Bicknell answered 12/1, 2022 at 0:53 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.