UEDL12——AssetDatabase公共类
UEDL12——AssetDatabase公共类
本章代码关键字
1 | AssetDatabase //用于在编辑器环境中管理和操作项目中的资源(Assets)的编辑器公共类 |
AssetDatabase
它是 Unity 引擎中的一个编辑器类,用于在编辑器环境中管理和操作项目中的资源(Assets)
它提供了一系列静态方法,使得开发者能够在编辑器脚本中进行资源的创建、拷贝、移动、删除等操作
关于 AssetDatabase
相关的更多内容:
- AssetDatabase - Unity 脚本 API(中文文档,缺失部分翻译)
- Unity - Scripting API: AssetDatabase (unity3d.com)(英文文档)
在哪里使用AssetDatabase公共类中的相关内容
在编辑器相关处理都可以使用AssetDatabase
公共类中的相关内容
它主要提供的是一些资源相关的辅助功能,可以在编辑器拓展开发的任意地方使用
但一定注意,它属于编辑器功能,无法被打包出去,只能在Unity编辑器中使用
准备工作
AssetDatabase
可以在任何编辑器功能开发时使用,但是为了之后的知识点讲解更方便,我们通过一个自定义窗口来进行知识讲解
AssetDatabase类的常用API
-
AssetDatabase.CreateAsset()
创建资源,我们可以通过代码动态创建一些资源,路径从Assets/...
开始- 参数一:要创建为本地文件的资源的数据(
Object
类型数据) - 参数二:创建路径,该路径是基于工程所在的路径的,路径从
Assets/...
开始
注意:不能在StreamingAssets中创建资源,不能创建预设体(预设体创建之后会讲)
只能创建资源相关,例如材质球等,路径需要写后缀1
2
3
4
5if (GUILayout.Button("创建资源"))
{
Material material = new Material(Shader.Find("Specular")); //使用Unity自带的Shader
AssetDatabase.CreateAsset(material, "Assets/Resources/MyMaterial.mat");
}效果如下:
- 参数一:要创建为本地文件的资源的数据(
-
AssetDatabase.CreateFolder()
创建文件夹,路径从Assets/...
开始- 参数一:文件夹要创建到相对于工程所在路径的哪个文件夹下,路径从
Assets/...
开始 - 参数二:创建的文件夹名
1
2
3
4if (GUILayout.Button("创建文件夹"))
{
AssetDatabase.CreateFolder("Assets/Resources", "MyTestFolder");
}效果如下:
- 参数一:文件夹要创建到相对于工程所在路径的哪个文件夹下,路径从
-
AssetDatabase.CopyAsset()
拷贝资源,路径从Assets/...
开始- 参数一:要复制的源资源的路径,该路径是基于工程所在的路径的,路径从
Assets/...
开始 - 参数二:拷贝(复制)目标路径,该路径是基于工程所在的路径的,路径从
Assets/...
开始
注意:需要写后缀名
1
2
3
4if (GUILayout.Button("拷贝资源"))
{
AssetDatabase.CopyAsset("Assets/Editor Default Resources/EditorTeach.png", "Assets/Resources/MyTestFolder/EditorTeach.png");
}效果如下:
- 参数一:要复制的源资源的路径,该路径是基于工程所在的路径的,路径从
-
AssetDatabase.MoveAsset()
移动资源,路径从Assets/...
开始- 参数一:要移动的资源的路径,该路径是基于工程所在的路径的,路径从
Assets/...
开始 - 参数二:移动目标路径,该路径是基于工程所在的路径的,路径从
Assets/...
开始
注意:需要写后缀名
1
2
3
4if (GUILayout.Button("移动资源"))
{
AssetDatabase.MoveAsset("Assets/Resources/MyTestFolder/EditorTeach.png", "Assets/Resources//EditorTeach.png");
}效果如下:
- 参数一:要移动的资源的路径,该路径是基于工程所在的路径的,路径从
-
AssetDatabase.DeleteAsset()
删除资源,路径从Assets/...
开始- 参数:要删除的资源的路径,该路径是基于工程所在的路径的,路径从
Assets/...
开始
1
2
3
4if (GUILayout.Button("删除资源"))
{
AssetDatabase.DeleteAsset("Assets/Resources/EditorTeach.png");
}注意:需要写后缀名
效果如下:
- 参数:要删除的资源的路径,该路径是基于工程所在的路径的,路径从
-
AssetDatabase.DeleteAssets()
批量删除资源,路径从Assets/...
开始- 要批量删除的资源的路径数组,该路径是基于工程所在的路径的,路径从
Assets/...
开始 - 接收批量删除失败的路径的列表
1
2
3
4
5
6
7
8
9
10
11
12if (GUILayout.Button("批量删除资源"))
{
List<string> failList = new List<string>();
AssetDatabase.DeleteAssets(new string[] {
"Assets/Resources/EditorTeach.png",
"Assets/Resources/EditorTeach2.png",
}, failList);
for (int i = 0; i < failList.Count; i++)
{
Debug.Log(failList[i]);
}
}效果如下:
- 要批量删除的资源的路径数组,该路径是基于工程所在的路径的,路径从
-
AssetDatabase.GetAssetPath()
获取资源路径 可以配合Selection选中资源一起使用- 参数:要获取路径的资源对象
- 返回值:资源的路径,该路径是基于工程所在的路径的,路径从
Assets/...
开始,如果传入的资源找不到会返回空字符串
1
2
3
4if (GUILayout.Button("获取资源路径"))
{
Debug.Log(AssetDatabase.GetAssetPath(Selection.activeObject));
}效果如下:
-
AssetDatabase.LoadAssetAtPath()
根据路径加载资源,路径从Assets/
开始该方法在开发模式下适用于从 Resources 和 AB 包以外的工程路径下的文件夹内加载资源,不要将其用于会打包出去的游戏逻辑内
- 参数一:要加载的资源路径,该路径是基于工程所在的路径的,路径从
Assets/...
开始 - 参数二:资源的类型(该参数可以由泛型参数代替)
1
2
3
4
5if (GUILayout.Button("加载资源"))
{
Texture tex = AssetDatabase.LoadAssetAtPath<Texture>("Assets/Resources/EditorTeach.png");
Debug.Log(tex.name);
}效果如下:
- 参数一:要加载的资源路径,该路径是基于工程所在的路径的,路径从
-
AssetDatabase.LoadAllAssetsAtPath()
根据路径加载资源,同时返回该资源本身和该资源的子资源,路径从Assets/
开始一般可以用来加载图集资源,返回值为
Object
数组,如果是图集,第一个为图集本身,之后的便是图集中的所有Sprite
关于图集,具体可见:图集制作:Sprite Atlas,设置图集:U3L3-2——Multiple图集元素分割
- 参数:要批量加载的资源路径,该路径是基于工程所在的路径的,路径从
Assets/...
开始 - 返回值:批量加载出来的资源数组,如果加载的是图集资源,则返回的数组第一个元素是图集本身,后面的全是图集内的
Sprite
1
2
3
4
5
6
7
8if (GUILayout.Button("加载图集"))
{
Object[] atlas = AssetDatabase.LoadAllAssetsAtPath("Assets/Resources/Mario.png");
for (int i = 0; i < atlas.Length; i++)
{
Debug.Log(atlas[i].name);
}
}效果如下:
- 参数:要批量加载的资源路径,该路径是基于工程所在的路径的,路径从
-
AssetDatabase.Refresh()
刷新 Project 窗口内容,当对资源进行移动、导入、删除等操作后,需要执行刷新当使用 C# IO 相关方法等创建文件到工程的 Assets 文件夹内时,往往 Project 窗口是不能自动刷新看到创建出来的文件的
因此需要使用该方法刷新Project 窗口,让我们看到资源1
2
3
4
5if (GUILayout.Button("刷新资源窗口"))
{
File.WriteAllText(Application.dataPath + "/Resources/test2.txt", "123123123");
AssetDatabase.Refresh();
}效果如下:
-
AssetDatabase.GetImplicitAssetBundleName()
返回资源所属的AB包名,路径从Assets/
开始关于AB包的具体内容,可见:UH1——AssetBundle
- 参数:要查询所属的AB包的资源的路径,该路径是基于工程所在的路径的,路径从
Assets/
开始 - 返回值:资源所属AB包名字
1
2
3
4if (GUILayout.Button("获取资源来自哪个AB包"))
{
Debug.Log(AssetDatabase.GetImplicitAssetBundleName("Assets/Gizmos/MyIcon.png"));
}显示效果:
- 参数:要查询所属的AB包的资源的路径,该路径是基于工程所在的路径的,路径从
-
AssetDatabase.LoadAllAssetRepresentationsAtPath()
返回在项目视图中可见的子资源,路径从Assets/
开始它和 AssetDatabase.LoadAllAssetsAtPath() 都能用来加载图集资源,返回值为
Object
数组,
但该方法和AssetDatabase.LoadAllAssetsAtPath()
最大的区别是,它返回的Object
数组是不包含主资源本身的
因此,由该方法加载的图集资源,返回的数组不包括图集资源本身,而是图集资源下的所有子图- 参数:要批量加载的资源路径,该路径是基于工程所在的路径的,路径从
Assets/...
开始 - 返回值:批量加载出来的资源数组,如果加载的是图集资源,则返回的数组全是图集内的
Sprite
1
2
3
4
5
6
7
8if (GUILayout.Button("不加载图集文件本身的加载图集"))
{
Object[] atlas = AssetDatabase.LoadAllAssetRepresentationsAtPath("Assets/Resources/Mario.png");
for (int i = 0; i < atlas.Length; i++)
{
Debug.Log(atlas[i].name);
}
}显示效果:
- 参数:要批量加载的资源路径,该路径是基于工程所在的路径的,路径从
AssetDatabase类的其他API
查找资源 Guid
在 Unity 内所有的位于 Assets
目录下的文件都会有一个自己的 Guid
,可以通过 AssetDatabase.FindAssets
来获取某个目录下所有文件的 Guid
-
参数一:
filter
,通过特定格式的筛选字符串可以查找特定文件,就类似于在 Unity 编辑器使用搜索栏查找文件
filter
的填入有一定的规则:- 关键词搜索:直接传入关键词,可以找到名称中包含该关键词的所有资源,例如传入
"Player"
就会存储所有名字包含 “Player” 的文件 - 类型过滤器:指定资源的类型作为搜索条件。格式为
t:TypeName
,其中TypeName
是你想要查找的资源类型,如Texture
,Material
,Script
,Prefab
等。如果要查找所有的材质资源,可以传入"t:Material"
- 标签过滤器:如果资源存在标签,可以通过标签来搜索资源,格式为
l:LabelName
,其中LabelName
是资源上的标签名。 - 以上规则可以组合使用,使用空格分割即可,例如传入
"Player t:Prefab"
就可以查找名称中包含 “Player” 的所有预制体
- 关键词搜索:直接传入关键词,可以找到名称中包含该关键词的所有资源,例如传入
-
参数二(可选):
searchInFolders
,从哪些文件夹(路径限制为Assets
目录下)下开始搜索,不填默认搜索整个Assets
目录下的文件 -
返回值:找到的文件的字符串形式的
Guid
数组,若未找到适配的文件,返回空数组
假设要查找此目录下所有的文件:
1 | using UnityEngine; |
输出:
通过 Guid 查找资源路径
Unity 内所有的位于 Assets
目录下的文件都会有一个自己的 Guid
,根据资源的 Guid
通过 AssetDatabase.GUIDToAssetPath
来资源所在路径
此方法对于自动化构建流程、编辑器脚本编写以及动态加载资源非常有用。
- 参数一:资源文件的
Guid
- 返回值:资源文件的路径
假设要获取此目录下所有的文件的路径:
1 | using UnityEngine; |
输出:
获取资源的所有依赖项
AssetDatabase.GetDependencies()
方法可以查找一个资源所依赖的所有资源的路径数组,此方法可以用于防止资源加载或打包时出现资源丢失的情况
-
参数一:需要获取所有依赖项的资源的路径
-
参数二(可选):设置为
true
时,此方法会以递归方式检查并返回包括间接依赖关系在内的所有依赖关系,否则仅返回直接依赖关系注意!如果此项为
true
,返回的数组也将包含输入路径本身。 -
返回值:所有依赖的资源路径字符串数组
假设要获取此路径下的资源的依赖项:
1 | using UnityEngine; |
输出: