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



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

尝试了几种Resources.loadAll方法,之后获得.name但没有成功

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

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

以下是要执行的操作:

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

2.获取所有带有Directory.GetFiles的文件名,将其序列化为json并将其保存到资源文件夹。我们使用 json 来更轻松地读取单个文件名。您不必使用 json。您必须排除".meta">扩展名。

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

3. 在构建后或运行时,您可以使用Resources.Load<TextAsset>("FileNames")TextAsset访问包含文件名的已保存文件,然后从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);
}

如果你正在制作一个工具或其他东西,这可能对你有用。

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

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.
}

如果你想在构建上做这样的事情,我可以介绍可寻址的 https://docs.unity3d.com/Packages/com.unity.addressables@0.8/manual/index.html

Const String imageGroupKey = ""; //Group key for those images
//not limited to Texture2D, can also be Sprite or something
Addressables.LoadAssetsAsync<Texture2D>(imageGroupKey , obj =>
{
Debug.Log("Files = " + obj.name);
});

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

相关内容

  • 没有找到相关文章

最新更新