从 Resources 子文件夹中获取文件名

问题描述 投票:0回答:2

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

尝试了几种

Resources.loadAll
方法之后获取.name但没有成功

是实现我在这里尝试做的事情的正确做法吗?

c# unity3d path resources
2个回答
6
投票

没有内置 API 来执行此操作,因为信息不是在您构建之后。你甚至不能用接受的答案中的内容来做到这一点。这只适用于编辑器。当您构建项目时,您的代码将失败。

这是要做的事情:

1。在

OnPreprocessBuild
函数中检测构建按钮何时被点击或构建即将发生。

2。获取所有带

Directory.GetFiles
的文件名,序列化为json保存到Resources文件夹。我们使用 json 来更容易读取单个文件名。你不必使用 json。您必须排除 ".meta" 扩展名。

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

3。在构建之后或在运行时期间,您可以使用

TextAsset
访问包含文件名的已保存文件,然后从
Resources.Load<TextAsset>("FileNames")
.
 中反序列化 json

下面是一个非常简单的例子。没有错误处理,这取决于您实施。当您单击“构建”按钮时,下面的编辑器脚本会保存文件名:

TextAsset.text

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

[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(); } }



-2
投票

(注意这只适用于编辑器,不适用于您的构建)

//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); }

如果你想在构建中做这样的事情,我可以介绍 addressable
https://docs.unity3d.com/Packages/[email protected]/manual/index.html

using System.IO; Const String path = ""; /folder path private List<Texture2D> GetImages() { List<Texture2D> imageList = new List<Texture2D>(); //This is an array of file paths string[] files = Directory.GetFiles(path, "*.png"); foreach (string file in files) { string fileName = Path.GetFileName(file); Debug.Log(fileName); //If you want to use those images. byte[] bytes = File.ReadAllBytes(file); Texture2D text2d = new Texture2D(0, 0); text2d.LoadImage(bytes); imageList.Add(text2d); } return imageList; //GUI.DrawTexture() away. }

编辑后的答案,原谅我 5 岁的年轻自己没有弄清楚在哪里使用代码。我给找到这个答案的人带来了很多麻烦。

© www.soinside.com 2019 - 2024. All rights reserved.