Unity和C#常用的文件搜索和导入方式

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

肯定还有很多其它的方法会用到 还需要不断地积累了

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注