Unity和C#常用的文件搜索和导入方式
最近写编辑器拓展的时候经常要用到文件搜索和读取
所以简单写篇文章来记录一下自己最近比较常用的一些方法
DirectoryInfo类
主要是用来复制 移动 重命名 创建和删除目录
在这里主要是用来找到目录下的文件夹或者文件
使用的时候声明一个该类型的变量
在构造函数里传入路径 就可以获取到这个路径下所有的文件和文件夹信息
在这里path是相对路径的字符串 绝对路径应该也没问题
if (Directory.Exists(path)) { DirectoryInfo directoryInfo = new DirectoryInfo(path); }
基于上面的基础 如果想要获取路径下的文件夹
或者是获取路径下的文件 只需要再加上一句代码
if (Directory.Exists(path)) { DirectoryInfo directoryInfo = new DirectoryInfo(path); //读取路径下的文件夹(只有路径下 不包括子文件夹) DirectoryInfo[] folders = directoryInfo.GetDirectories(); //读取路径下某一类型的文件 *是占位符 第二个参数指定搜索方式 FileInfo[] files = directoryInfo.GetFiles("*.asset", SearchOption.TopDirectoryOnly); }
第一个参数指定了搜索的文件类型
第二个参数 SearchOption指定了搜索方式
SearchOption.TopDirectoryOnly 只搜索当前路径
SearchOption.AllDirectories 搜索包含子文件夹的全部路径
FileInfo类
主要提供了创建 复制 删除 移动和打开文件的方法
在这里其实用的并不是很多
主要是要介绍两个属性 一个是Name 一个是FullName
Name就是包括拓展名的名字 例如test.txt
FullName则是连路径也包括了 例如E:\test.txt
之所以提到这个是因为unity加载文件的API要求用相对路径
所以就会需要字符串拼接替换的情况
此外也有类似Delete()方法可以直接永久删除文件
GetType()方法可以获取当前实例的Type
这里就不再做详细介绍了
绝对路径到相对路径的转换
string fullPath = file.FullName; string relativePath = fullPath.Substring(fullPath.IndexOf("Assets")); relativePath = relativePath.Replace('\\', '/');
这里主要是用到了刚才讲到的FullName
然后截取到包含Assets在内的部分
最后再对所有的反斜杠\替换为正斜杠/
大多数情况下正斜杠和反斜杠其实是可以互换的 没有影响
AssetDatabase 资源数据库
这个是Unity的概念 主要用于把资源文件中的数据转换为程序能用的格式
例如最近搞行为树有个黑板的资源文件是以.asset形式保存的
使用的时候需要按照Blackboard这个类来读取
这个时候就需要用到资源数据库的API
Blackboard blackboard = AssetDatabase.LoadAssetAtPath<Blackboard>(path);
这里的path要求必须是相对路径 所以就要用到上面提到的方法转换一下
资源数据库也支持批量加载
因为有可能一些资源会有多个子资源(类似压缩文件的分卷存储)
Object[] data = AssetDatabase.LoadAllAssetsAtPath("Assets/MySpriteTexture.png"); // outputs: // 5 Assets // MySpriteTexture (UnityEngine.Texture2D) // MyTexture_0 (UnityEngine.Sprite) // MyTexture_1 (UnityEngine.Sprite) // MyTexture_2 (UnityEngine.Sprite) // MyTexture_3 (UnityEngine.Sprite)
不考虑性能的做法
string[] guids = AssetDatabase.FindAssets("t:MediaResources");
全局搜索 搜索范围是整个资源数据库(Assets)
可以通过标识类型来查找需要的资源
例如关键字”t:” 指定了正在查找的资源类型是MediaResources
关键字”l:” 指定了带有特定标签的资源
最后这个API会返回一个存有文件GUID的数组
要加载的话还需要把GUID转换为路径 再通过路径加载资源
string path = AssetDatabase.GUIDToAssetPath(guids[0]); var resource = AssetDatabase.LoadAssetAtPath<Blackboard>(path);
这里只是简单了总结了一下这段时间用到的API
肯定还有很多其它的方法会用到 还需要不断地积累了