Best way of dynamically loading assets for procedural content

The folder structure of your files gets lost when you build the game. The StreamingAssets folder is left as-is in your built project, but those files will be accessible and modifiable to users.

I recommend using ScriptableObjects to organize your assets. A ScriptableObject is like a monobehaviour that doesn’t attach to a GameObject or belong to a scene, and sits as an asset in your project folder. You could write a single ScriptableObject class and instantiate multiple copies to represent your different content categories and store references to them. Unity - Manual: ScriptableObject

Here’s an example.

using UnityEngine;

[CreateAssetMenu(fileName = "AssetCategory", menuName = "Data/AssetCategory", order = 0)]
public class AssetCategory : ScriptableObject
{

    public Sprite[] spriteAssets;
    public AudioClip[] audioAssets;

}

That will add a new “create” option when you right-click in the asset folder.

You can then assign references to your new asset like you could with a monobehaviour.
5367018--542979--upload_2020-1-13_11-46-16.png

Objects in your scene can store references to your ScriptableObjects for easy access.