从资源子文件夹获取文件名

时间:2018-10-19 08:57:02

标签: c# unity3d path resources

在我的Resources文件夹中,我有一个图像子文件夹,我想从该文件夹中获取这些图像的所有文件名。

尝试了几种Resources.loadAll方法来随后获取.name但没有成功

在这里实现我想要做的是正确的做法吗?

2 个答案:

答案 0 :(得分:0)

嗯...为什么不试试这个。

using System.IO;

Const String path = ""; /file path

private void GetFiles()
{
     string [] files = Directory.GetFiles (path, "*.*");
     foreach (string sourceFile in files)
     {
          string fileName = Path.GetFileName (sourceFile);
          Debug.Log("fileName");
     }
}

答案 1 :(得分:0)

没有内置的API可以执行此操作,因为该信息不是在您生成之后生成的。您甚至无法使用accepted answer中的内容执行此操作。那只会在编辑器中起作用。当您构建项目时,您的代码将失败。

这是做什么:

1 。检测何时单击构建按钮,或者何时在OnPreprocessBuild函数中进行构建。

2 。使用Directory.GetFiles获取所有文件名,将其序列化为json并将其保存到 Resources 文件夹中。我们使用json使其更易于读取单个文件名。您不必使用json。您必须排除“。meta” 扩展名。

步骤1和2在编辑器中完成。

3 。在构建后或运行时,您可以使用TextAssetResources.Load<TextAsset>("FileNames")的形式访问包含文件名的保存文件,然后从TextAsset.text反序列化json。


下面是非常简化的示例。没有错误处理,这取决于您实现。单击“生成”按钮时,下面的“编辑器”脚本将保存文件名:

[Serializable]
public class FileNameInfo
{
    public string[] fileNames;

    public FileNameInfo(string[] fileNames)
    {
        this.fileNames = fileNames;
    }
}

class PreBuildFileNamesSaver : IPreprocessBuildWithReport
{
    public int callbackOrder { get { return 0; } }
    public void OnPreprocessBuild(UnityEditor.Build.Reporting.BuildReport report)
    {
        //The Resources folder path
        string resourcsPath = Application.dataPath + "/Resources";

        //Get file names except the ".meta" extension
        string[] fileNames = Directory.GetFiles(resourcsPath)
            .Where(x => Path.GetExtension(x) != ".meta").ToArray();

        //Convert the Names to Json to make it easier to access when reading it
        FileNameInfo fileInfo = new FileNameInfo(fileNames);
        string fileInfoJson = JsonUtility.ToJson(fileInfo);

        //Save the json to the Resources folder as "FileNames.txt"
        File.WriteAllText(Application.dataPath + "/Resources/FileNames.txt", fileInfoJson);

        AssetDatabase.Refresh();
    }
}

在运行时,您可以使用以下示例检索保存的文件名:

//Load as TextAsset
TextAsset fileNamesAsset = Resources.Load<TextAsset>("FileNames");
//De-serialize it
FileNameInfo fileInfoLoaded = JsonUtility.FromJson<FileNameInfo>(fileNamesAsset.text);
//Use data?
foreach (string fName in fileInfoLoaded.fileNames)
{
    Debug.Log(fName);
}