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);
}
}显示效果:
- 参数:要批量加载的资源路径,该路径是基于工程所在的路径的,路径从