44.AssetDatabase常用API

44.AssetDatabase-AssetDatabase常用API


44.1 知识点

AssetDatabase中的常用API

创建资源

private void OnGUI()
{
    // 创建资源,我们可以通过代码动态创建一些资源
    // 路径从 Assets/...开始
    // AssetDatabase.CreateAsset(资源,路径);
    // 注意:
    // 不能在StreamingAssets中创建资源,
    // 不能创建预设体(预设体创建之后会讲),
    // 只能创建资源相关,例如材质球等
    // 路径需要写后缀
    if (GUILayout.Button("创建资源"))
    {
        Material mat = new Material(Shader.Find("Specular"));
        AssetDatabase.CreateAsset(mat, "Assets/Resources/MyMaterial.mat");
    }
}

创建文件夹

private void OnGUI()
{
    // 创建文件夹,路径从 Assets/...开始
    // AssetDatabase.CreateFolder(父文件夹,新文件夹名)
    if (GUILayout.Button("创建文件夹"))
    {
        AssetDatabase.CreateFolder("Assets/Resources", "MyTestFolder");
    }
}

拷贝资源

private void OnGUI()
{
    // 拷贝资源,路径从 Assets/...开始
    // AssetDatabase.CopyAsset(源资源,目标路径)
    // 注意:
    // 需要写后缀名
    if (GUILayout.Button("拷贝资源"))
    {
        AssetDatabase.CopyAsset("Assets/Editor Default Resources/head.png",
            "Assets/Resources/MyTestFolder/head.png");
    }
}

移动资源

private void OnGUI()
{
    // 移动资源,路径从 Assets/...开始
    // AssetDatabase.MoveAsset(老路径, 新路径);
    if (GUILayout.Button("移动资源"))
    {
        AssetDatabase.MoveAsset("Assets/Resources/MyTestFolder/head.png",
            "Assets/Resources/head.png");
    }
}

删除资源

private void OnGUI()
{
    // 删除资源,路径从 Assets/...开始
    // AssetDatabase.DeleteAsset(资源路径)
    if (GUILayout.Button("删除资源"))
    {
        AssetDatabase.DeleteAsset("Assets/Resources/head.png");
    }
}

批量删除资源

private void OnGUI()
{
    // 批量删除资源,路径从 Assets/...开始
    // AssetDatabase.DeleteAssets(string[] 路径们, List<string> 用于存储删除失败的路径)
    if (GUILayout.Button("批量删除资源"))
    {
        List<string> failList = new List<string>();
        AssetDatabase.DeleteAssets(
            new string[] { "Assets/Resources/head.png", "Assets/Resources/head2.png" }, failList);
        for (int i = 0; i < failList.Count; i++)
        {
            Debug.Log(failList[i]);
        }
    }
}

获取资源路径

private void OnGUI()
{
    // 获取资源路径 可以配合Selection选中资源一起使用
    // AssetDatabase.GetAssetPath(资源)
    if (GUILayout.Button("获取资源路径"))
    {
        Debug.Log(AssetDatabase.GetAssetPath(Selection.activeObject));
    }
}

根据路径加载资源

private void OnGUI()
{
    // 根据路径加载资源,路径从Assets/开始
    // AssetDatabase.LoadAssetAtPath(资源路径) 
    // 编辑器下才会使用
    if (GUILayout.Button("加载资源"))
    {
        Texture txt = AssetDatabase.LoadAssetAtPath<Texture>("Assets/Resources/head.png");
        Debug.Log(txt.name);
    }
}

刷新,当对资源进行移动、导入、删除等操作后,需要执行刷新

private void OnGUI()
{
    // 刷新,当对资源进行移动、导入、删除等操作后,需要执行刷新
    // AssetDatabase.Refresh()
    if (GUILayout.Button("测试刷新"))
    {
        // 创建文件时不使用Unity相关API的话就要调用刷新 才能在Project窗口中显示
        File.WriteAllText(Application.dataPath + "/Resources/test2.txt", "123123123");
        AssetDatabase.Refresh();
    }
}

返回资源所属的AB包名

private void OnGUI()
{
    // 返回资源所属的AB包名,路径从Assets/开始
    // GetImplicitAssetBundleName(资源路径);
    if (GUILayout.Button(""))
    {

    }
}

更多内容

官方文档:AssetDatabase


44.2 知识点代码

Lesson44_AssetDatabase_AssetDatabase常用API

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson44_AssetDatabase_AssetDatabase常用API : MonoBehaviour
{
    void Start()
    {
        #region 知识点一 AssetDatabase中的常用API

        //1.创建资源,我们可以通过代码动态创建一些资源
        //  路径从 Assets/...开始
        //  AssetDatabase.CreateAsset(资源,路径);
        //  注意:
        //  不能在StreamingAssets中创建资源,
        //  不能创建预设体(预设体创建之后会讲),
        //  只能创建资源相关,例如材质球等
        //  路径需要写后缀

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

        //3.拷贝资源,路径从 Assets/...开始
        //  AssetDatabase.CopyAsset(源资源,目标路径)
        //  注意:
        //  需要写后缀名

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

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

        //6.批量删除资源,路径从 Assets/...开始
        //  AssetDatabase.DeleteAssets(string[] 路径们, List<string> 用于存储删除失败的路径)

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

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

        //9.根据路径加载所有资源,路径从Assets/开始
        //  AssetDatabase.LoadAllAssetsAtPath(资源路径);
        //  一般可以用来加载图集资源,返回值为Object数据
        //  如果是图集,第一个为图集本身,之后的便是图集中的所有Sprite

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

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

        #endregion

        #region 知识点二 更多内容

        //官方文档:https://docs.unity3d.com/ScriptReference/AssetDatabase.html

        #endregion
    }
}

MyAssetDatabaseLearnWindow

using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;


public class MyAssetDatabaseLearnWindow : EditorWindow
{
    [MenuItem("编辑器拓展教程/MyAssetDatabaseLearnWindow")]
    private static void OpenMyAssetDatabaseLearnWindow()
    {
        MyAssetDatabaseLearnWindow win = EditorWindow.GetWindow<MyAssetDatabaseLearnWindow>("AssetDatabase知识学习");
        win.Show();
    }



    private void OnEnable()
    {

    }

    private void OnGUI()
    {
        //1.创建资源,我们可以通过代码动态创建一些资源
        //  路径从 Assets/...开始
        //  AssetDatabase.CreateAsset(资源,路径);
        //  注意:
        //  不能在StreamingAssets中创建资源,
        //  不能创建预设体(预设体创建之后会讲),
        //  只能创建资源相关,例如材质球等
        //  路径需要写后缀
        if (GUILayout.Button("创建资源"))
        {
            Material mat = new Material(Shader.Find("Specular"));
            AssetDatabase.CreateAsset(mat, "Assets/Resources/MyMaterial.mat");
        }

        //2.创建文件夹,路径从 Assets/...开始
        //  AssetDatabase.CreateFolder(父文件夹,新文件夹名)
        if (GUILayout.Button("创建文件夹"))
        {
            AssetDatabase.CreateFolder("Assets/Resources", "MyTestFolder");
        }

        //3.拷贝资源,路径从 Assets/...开始
        //  AssetDatabase.CopyAsset(源资源,目标路径)
        //  注意:
        //  需要写后缀名
        if (GUILayout.Button("拷贝资源"))
        {
            AssetDatabase.CopyAsset("Assets/Editor Default Resources/head.png",
                "Assets/Resources/MyTestFolder/head.png");
        }

        //4.移动资源,路径从 Assets/...开始
        //  AssetDatabase.MoveAsset(老路径, 新路径);
        if (GUILayout.Button("移动资源"))
        {
            AssetDatabase.MoveAsset("Assets/Resources/MyTestFolder/head.png",
                "Assets/Resources/head.png");
        }

        //5.删除资源,路径从 Assets/...开始
        //  AssetDatabase.DeleteAsset(资源路径)
        if (GUILayout.Button("删除资源"))
        {
            AssetDatabase.DeleteAsset("Assets/Resources/head.png");
        }

        //6.批量删除资源,路径从 Assets/...开始
        //  AssetDatabase.DeleteAssets(string[] 路径们, List<string> 用于存储删除失败的路径)
        if (GUILayout.Button("批量删除资源"))
        {
            List<string> failList = new List<string>();
            AssetDatabase.DeleteAssets(
                new string[] { "Assets/Resources/head.png", "Assets/Resources/head2.png" }, failList);
            for (int i = 0; i < failList.Count; i++)
            {
                Debug.Log(failList[i]);
            }
        }

        //7.获取资源路径 可以配合Selection选中资源一起使用
        //  AssetDatabase.GetAssetPath(资源)
        if (GUILayout.Button("获取资源路径"))
        {
            Debug.Log(AssetDatabase.GetAssetPath(Selection.activeObject));
        }

        //8.根据路径加载资源,路径从Assets/开始
        //  AssetDatabase.LoadAssetAtPath(资源路径) 
        // 编辑器下才会使用
        if (GUILayout.Button("加载资源"))
        {
            Texture txt = AssetDatabase.LoadAssetAtPath<Texture>("Assets/Resources/head.png");
            Debug.Log(txt.name);
        }

        //9.根据路径加载所有资源,路径从Assets/开始
        //  AssetDatabase.LoadAllAssetsAtPath(资源路径);
        //  一般可以用来加载图集资源,返回值为Object数据
        //  如果是图集,第一个为图集本身,之后的便是图集中的所有Sprite
        //if (GUILayout.Button(""))
        //{
        //    //AssetDatabase.LoadAllAssetsAtPath(资源路径);
        //}

        //10.刷新,当对资源进行移动、导入、删除等操作后,需要执行刷新
        //  AssetDatabase.Refresh()
        if (GUILayout.Button("测试刷新"))
        {
            //创建文件时不使用Unity相关API的话就要调用刷新 才能在Project窗口中显示
            File.WriteAllText(Application.dataPath + "/Resources/test2.txt", "123123123");
            AssetDatabase.Refresh();
        }

        //11.返回资源所属的AB包名,路径从Assets/开始
        //  GetImplicitAssetBundleName(资源路径);
        //if (GUILayout.Button(""))
        //{

        //}
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏