UEDL12——AssetDatabase公共类

本章代码关键字

1
2
3
4
5
6
7
8
9
10
11
12
13
AssetDatabase                                        //用于在编辑器环境中管理和操作项目中的资源(Assets)的编辑器公共类
AssetDatabase.CreateAsset() //将内存内的资源创建为工程下的本地文件,不能在StreamingAssets中创建资源,不能创建预设体
AssetDatabase.CreateFolder() //在工程文件夹下创建文件夹
AssetDatabase.CopyAsset() //将工程下的某个资源复制到工程下的另一个文件夹
AssetDatabase.MoveAsset() //将工程下的某个资源移动到工程下的另一个文件夹
AssetDatabase.DeleteAsset() //将工程下的某个资源删除
AssetDatabase.DeleteAssets() //批量删除一些资源,会将批量删除失败的资源路径添加到传入的列表内
AssetDatabase.GetAssetPath() //获取某个资源在工程下的路径
AssetDatabase.LoadAssetAtPath() //读取工程内某个文件的路径
AssetDatabase.LoadAllAssetsAtPath() //根据工程下的路径加载所有资源,可以批量加载某个图集里的所有Sprite
AssetDatabase.Refresh() //刷新Project窗口
AssetDatabase.GetImplicitAssetBundleName() //获取工程下的某个资源所属的AB包名
AssetDatabase.LoadAllAssetRepresentationsAtPath() //根据工程下的路径加载项目视图内可见的子资源,可加载图集里的所有Sprite,返回值不包括图集文件本身

AssetDatabase

它是 Unity 引擎中的一个编辑器类,用于在编辑器环境中管理和操作项目中的资源(Assets)
它提供了一系列静态方法,使得开发者能够在编辑器脚本中进行资源的创建、拷贝、移动、删除等操作

关于AssetDatabase​相关的更多内容:

在哪里使用AssetDatabase公共类中的相关内容

在编辑器相关处理都可以使用AssetDatabase​公共类中的相关内容
它主要提供的是一些资源相关的辅助功能,可以在编辑器拓展开发的任意地方使用
但一定注意,它属于编辑器功能,无法被打包出去,只能在Unity编辑器中使用

准备工作

AssetDatabase​可以在任何编辑器功能开发时使用,但是为了之后的知识点讲解更方便,我们通过一个自定义窗口来进行知识讲解

AssetDatabase类的常用API

  1. AssetDatabase.CreateAsset()​创建资源,我们可以通过代码动态创建一些资源,路径从 Assets/...​ 开始

    • 参数一:要创建为本地文件的资源的数据(Object​类型数据)
    • 参数二:创建路径,该路径是基于工程所在的路径的,路径从 Assets/...​ 开始

    注意:不能在StreamingAssets中创建资源,不能创建预设体(预设体创建之后会讲)
    只能创建资源相关,例如材质球等,路径需要写后缀

    1
    2
    3
    4
    5
    if (GUILayout.Button("创建资源"))
    {
    Material material = new Material(Shader.Find("Specular")); //使用Unity自带的Shader
    AssetDatabase.CreateAsset(material, "Assets/Resources/MyMaterial.mat");
    }

    效果如下:image

  2. AssetDatabase.CreateFolder()​ 创建文件夹,路径从 Assets/...​ 开始

    • 参数一:文件夹要创建到相对于工程所在路径的哪个文件夹下,路径从 Assets/...​ 开始
    • 参数二:创建的文件夹名
    1
    2
    3
    4
    if (GUILayout.Button("创建文件夹"))
    {
    AssetDatabase.CreateFolder("Assets/Resources", "MyTestFolder");
    }

    效果如下:​image

  3. AssetDatabase.CopyAsset()​ 拷贝资源,路径从 Assets/...​ 开始

    • 参数一:要复制的源资源的路径,该路径是基于工程所在的路径的,路径从 Assets/...​ 开始
    • 参数二:拷贝(复制)目标路径,该路径是基于工程所在的路径的,路径从 Assets/...​ 开始

    注意:需要写后缀名

    1
    2
    3
    4
    if (GUILayout.Button("拷贝资源"))
    {
    AssetDatabase.CopyAsset("Assets/Editor Default Resources/EditorTeach.png", "Assets/Resources/MyTestFolder/EditorTeach.png");
    }

    效果如下:image

  4. AssetDatabase.MoveAsset()​ 移动资源,路径从 Assets/...​ 开始

    • 参数一:要移动的资源的路径,该路径是基于工程所在的路径的,路径从 Assets/...​ 开始
    • 参数二:移动目标路径,该路径是基于工程所在的路径的,路径从 Assets/...​ 开始

    注意:需要写后缀名

    1
    2
    3
    4
    if (GUILayout.Button("移动资源"))
    {
    AssetDatabase.MoveAsset("Assets/Resources/MyTestFolder/EditorTeach.png", "Assets/Resources//EditorTeach.png");
    }

    效果如下:
    imageimage

  5. AssetDatabase.DeleteAsset()​删除资源,路径从 Assets/...​ 开始

    • 参数:要删除的资源的路径,该路径是基于工程所在的路径的,路径从 Assets/...​ 开始
    1
    2
    3
    4
    if (GUILayout.Button("删除资源"))
    {
    AssetDatabase.DeleteAsset("Assets/Resources/EditorTeach.png");
    }

    注意:需要写后缀名

    效果如下:
    image
    image

  6. AssetDatabase.DeleteAssets()​ 批量删除资源,路径从 Assets/...​ 开始

    • 要批量删除的资源的路径数组,该路径是基于工程所在的路径的,路径从 Assets/...​ 开始
    • 接收批量删除失败的路径的列表
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    if (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]);
    }
    }

    效果如下:
    image
    image

  7. AssetDatabase.GetAssetPath()​获取资源路径 可以配合Selection​选中资源一起使用

    • 参数:要获取路径的资源对象
    • 返回值:资源的路径,该路径是基于工程所在的路径的,路径从 Assets/...​ 开始,如果传入的资源找不到会返回空字符串
    1
    2
    3
    4
    if (GUILayout.Button("获取资源路径"))
    {
    Debug.Log(AssetDatabase.GetAssetPath(Selection.activeObject));
    }

    效果如下:image

  8. AssetDatabase.LoadAssetAtPath()​ 根据路径加载资源,路径从Assets/​开始

    该方法在开发模式下适用于从Resources和AB包以外的工程路径下的文件夹内加载资源,不要将其用于会打包出去的游戏逻辑内

    • 参数一:要加载的资源路径,该路径是基于工程所在的路径的,路径从 Assets/...​ 开始
    • 参数二:资源的类型(该参数可以由泛型参数代替)
    1
    2
    3
    4
    5
    if (GUILayout.Button("加载资源"))
    {
    Texture tex = AssetDatabase.LoadAssetAtPath<Texture>("Assets/Resources/EditorTeach.png");
    Debug.Log(tex.name);
    }

    效果如下:image

  9. AssetDatabase.LoadAllAssetsAtPath()​ 根据路径加载资源,同时返回该资源本身和该资源的子资源,路径从Assets/​开始

    一般可以用来加载图集资源,返回值为Object​数组,如果是图集,第一个为图集本身,之后的便是图集中的所有Sprite

    关于图集,具体可见:图集制作:Sprite Atlas,设置图集:U3L3-2——Multiple图集元素分割

    • 参数:要批量加载的资源路径,该路径是基于工程所在的路径的,路径从 Assets/...​ 开始
    • 返回值:批量加载出来的资源数组,如果加载的是图集资源,则返回的数组第一个元素是图集本身,后面的全是图集内的Sprite
    1
    2
    3
    4
    5
    6
    7
    8
    if (GUILayout.Button("加载图集"))
    {
    Object[] atlas = AssetDatabase.LoadAllAssetsAtPath("Assets/Resources/Mario.png");
    for (int i = 0; i < atlas.Length; i++)
    {
    Debug.Log(atlas[i].name);
    }
    }

    效果如下:image

  10. AssetDatabase.Refresh()​ 刷新Project窗口内容,当对资源进行移动、导入、删除等操作后,需要执行刷新

    当使用C#IO相关方法等创建文件到工程的Assets文件夹内时,往往Project窗口是不能自动刷新看到创建出来的文件的
    因此需要使用该方法刷新Project窗口,让我们看到资源

    1
    2
    3
    4
    5
    if (GUILayout.Button("刷新资源窗口"))
    {
    File.WriteAllText(Application.dataPath + "/Resources/test2.txt", "123123123");
    AssetDatabase.Refresh();
    }

    效果如下:
    image

    image

  11. AssetDatabase.GetImplicitAssetBundleName()​ 返回资源所属的AB包名,路径从Assets/​开始

    关于AB包的具体内容,可见:UH1——AssetBundle

    • 参数:要查询所属的AB包的资源的路径,该路径是基于工程所在的路径的,路径从Assets/​开始
    • 返回值:资源所属AB包名字
    1
    2
    3
    4
    if (GUILayout.Button("获取资源来自哪个AB包"))
    {
    Debug.Log(AssetDatabase.GetImplicitAssetBundleName("Assets/Gizmos/MyIcon.png"));
    }

    显示效果:image

  12. AssetDatabase.LoadAllAssetRepresentationsAtPath()​ 返回在项目视图中可见的子资源,路径从Assets/​开始

    它和 AssetDatabase.LoadAllAssetsAtPath()​ 都能用来加载图集资源,返回值为Object​数组,
    但该方法和AssetDatabase.LoadAllAssetsAtPath()​最大的区别是,它返回的Object数组是不包含主资源本身的
    因此,由该方法加载的图集资源,返回的数组不包括图集资源本身,而是图集资源下的所有子图

    • 参数:要批量加载的资源路径,该路径是基于工程所在的路径的,路径从 Assets/...​ 开始
    • 返回值:批量加载出来的资源数组,如果加载的是图集资源,则返回的数组全是图集内的Sprite
    1
    2
    3
    4
    5
    6
    7
    8
    if (GUILayout.Button("不加载图集文件本身的加载图集"))
    {
    Object[] atlas = AssetDatabase.LoadAllAssetRepresentationsAtPath("Assets/Resources/Mario.png");
    for (int i = 0; i < atlas.Length; i++)
    {
    Debug.Log(atlas[i].name);
    }
    }

    显示效果:image