效果说明:
1.通过在unity菜单面板上通过编辑器扩展,实现点击按钮更新资源配置文件
点击后生成名字为ResMap的文本文件(文件名字可以在代码中修改)
2.最终效果会生成一个资源路径配置文件,方便后续使用
代码:
注意此脚本必须放在Editor文件夹下
using System.IO;
using UnityEditor;
using UnityEngine;
//生成资源配置文件的类
public class GenerateResConfig : Editor
{
[MenuItem("Tools/Resources/Generate Config File")]
public static void Generate()
{
string path = Path.Combine(Application.dataPath, "Resources").Replace(@"\", "/");
string[] resFiles = Directory.GetFiles(path, "*.prefab", SearchOption.AllDirectories);
for(int i=0;i<resFiles.Length;i++)
{
string key = Path.GetFileNameWithoutExtension(resFiles[i]);
string value = resFiles[i].Replace(@"\", "/").Replace(path + "/", "").Replace(".prefab", "");
resFiles[i] = key+"="+value;
}
File.WriteAllLines(Path.Combine(path,"ResMap.txt"), resFiles);
AssetDatabase.Refresh();
}
}
部分代码详解
特性MenuItem解释
[MenuItem("Tools/Resources/Generate Config File")]是一个用于在Unity编辑器中创建自定义菜单项的标记。
Path.Combine()
string path = Path.Combine(Application.dataPath, "Resources").Replace(@"\", "/");
在Unity中,Path.Combine()方法用于将多个路径片段组合成一个完整的路径。它接受任意数量的字符串参数,并根据操作系统的规则自动处理路径分隔符。
Path.Combine()方法的使用非常简单,你只需要将要组合的路径片段作为参数传递给它。例如:
string path1 = "Assets";
string path2 = "Scripts";
string fullPath = Path.Combine(path1, path2);
在上面的例子中,Path.Combine()方法将会将"path1"和"path2"组合成一个完整的路径。结果将根据操作系统的规则自动处理路径分隔符,确保生成的路径在不同操作系统上都是有效的。
Path.Combine()方法还可以接受更多的路径片段作为参数,例如:
string path1 = "Assets";
string path2 = "Scripts";
string path3 = "Utils";
string fullPath = Path.Combine(path1, path2, path3);
在这个例子中,Path.Combine()方法将会将"path1"、"path2"和"path3"组合成一个完整的路径。
总结一下,Path.Combine()方法是一个方便的工具,用于将多个路径片段组合成一个完整的路径,并确保生成的路径在不同操作系统上都是有效的。这在文件操作中经常使用,特别是在构建文件路径时非常有用。
Application.dataPath()
在Unity中,Application.dataPath是一个只读属性,用于获取项目的Assets文件夹的绝对路径。
具体来说,Application.dataPath返回一个字符串,表示项目的Assets文件夹的绝对路径。在大多数情况下,它指向项目文件夹的"Assets"子文件夹。
例如,如果你的Unity项目位于"C:\MyProject"文件夹中,那么Application.dataPath将返回"C:\MyProject\Assets"。
需要注意的是,Application.dataPath返回的是一个绝对路径,而不是相对于项目的相对路径。这意味着无论你将项目移动到哪个位置,Application.dataPath始终指向Assets文件夹的绝对路径。
Application.dataPath在许多场景中非常有用,特别是在需要读取或写入项目中的文件时。你可以使用它来构建文件的完整路径,或者在文件操作中指定文件的位置。
需要注意的是,由于Application.dataPath返回的是一个只读属性,你不能直接修改它。如果你需要在项目中创建、修改或删除文件,你应该使用其他方法,如File类或AssetDatabase类提供的方法。
Directory.GetFiles()
string[] resFiles = Directory.GetFiles(path, "*.prefab", SearchOption.AllDirectories);
Directory.GetFiles()是一个用于获取指定目录中的文件路径的方法。它返回一个字符串数组,包含指定目录中所有文件的完整路径。
Directory.GetFiles()方法有多个重载形式,可以根据不同的参数来获取不同条件下的文件路径。以下是其中一个常用的重载形式的示例:
string[] filePaths = Directory.GetFiles(directoryPath);
在上面的示例中,directoryPath是一个字符串,表示要获取文件路径的目录的路径。Directory.GetFiles()将返回一个字符串数组,其中包含指定目录中所有文件的完整路径。
需要注意的是,Directory.GetFiles()默认只返回指定目录中的文件路径,不包括子目录中的文件。如果你需要获取子目录中的文件路径,可以使用另一个重载形式,并指定搜索选项为SearchOption.AllDirectories,例如:
string[] filePaths = Directory.GetFiles(directoryPath, "*", SearchOption.AllDirectories);
在这个示例中,"*"表示匹配所有文件,SearchOption.AllDirectories表示搜索包括子目录在内的所有目录。
Directory.GetFiles()方法还可以使用通配符来筛选文件路径。例如,你可以使用 "*.txt" 来获取指定目录中所有扩展名为txt的文件路径。
总结一下,Directory.GetFiles()是一个用于获取指定目录中文件路径的方法。它返回一个字符串数组,包含指定目录中所有文件的完整路径。你可以使用不同的参数来控制获取文件路径的条件,例如指定目录、搜索选项和通配符等。
Path.GetFileNameWithoutExtension()
Path.GetFileNameWithoutExtension()是一个用于获取文件名(不包括扩展名)的方法。它接受一个字符串参数,表示文件路径,并返回文件名(不包括扩展名)。
以下是Path.GetFileNameWithoutExtension()的示例用法:
string filePath = "C:/Folder/File.txt";
string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(filePath);
在上面的示例中,filePath是一个字符串,表示文件的完整路径。Path.GetFileNameWithoutExtension()将返回一个字符串,表示文件名(不包括扩展名)。在这个示例中,fileNameWithoutExtension将被赋值为"File"。
需要注意的是,Path.GetFileNameWithoutExtension()方法只返回文件名的部分,不包括路径和扩展名。如果文件路径中包含多级目录,该方法只返回最后一个目录中的文件名。
如果文件路径中没有扩展名,Path.GetFileNameWithoutExtension()将返回完整的文件名。
Path.GetFileNameWithoutExtension()方法对于从文件路径中提取文件名并进行处理非常有用。你可以使用它来获取文件名并进行进一步的操作,例如重命名文件或生成新的文件名。
总结一下,Path.GetFileNameWithoutExtension()是一个用于获取文件名(不包括扩展名)的方法。它接受一个字符串参数,表示文件路径,并返回文件名(不包括扩展名)。使用该方法可以方便地从文件路径中提取文件名并进行处理。
AssetDatabase.Refresh()
AssetDatabase.Refresh()是Unity中的一个静态方法,用于刷新AssetDatabase的状态,使其与磁盘上的文件同步。
在Unity中,AssetDatabase是一个用于管理项目中资源的工具类。它负责维护资源的导入、导出、移动、删除等操作,并提供了一些用于查询和操作资源的方法。
当你在Unity编辑器中对项目中的资源进行了一些操作(如添加、删除、移动文件等),这些操作可能不会立即反映在AssetDatabase中。这时,你可以调用AssetDatabase.Refresh()方法来强制刷新AssetDatabase,使其与磁盘上的文件同步。
调用AssetDatabase.Refresh()方法后,Unity将重新扫描项目文件夹,并更新AssetDatabase中的资源信息。这意味着新添加的文件将被导入,已删除的文件将被移除,已移动的文件将被更新等。
需要注意的是,AssetDatabase.Refresh()是一个比较耗时的操作,特别是在项目中包含大量资源的情况下。因此,建议在必要时才调用该方法,以避免不必要的性能开销。
另外,AssetDatabase.Refresh()方法通常在脚本中使用,以确保在进行资源操作后,AssetDatabase中的资源信息得到及时更新。例如,在脚本中添加或删除文件后,你可以调用AssetDatabase.Refresh()来确保新的文件在编辑器中可见。
总结一下,AssetDatabase.Refresh()是一个用于刷新AssetDatabase的状态,使其与磁盘上的文件同步的方法。调用该方法后,Unity将重新扫描项目文件夹,并更新AssetDatabase中的资源信息。它通常在脚本中使用,以确保在进行资源操作后,AssetDatabase中的资源信息得到及时更新。
注:本博客为学习笔记,内容仅供参考。