Unity里的AssetDataBase简单介绍

CreateAsset()
使用这个方法我们可以生成一个文件在我们制定的路径里,例如

        GameObject cube = GameObject.Find("Cube");
        var objre = cube.GetComponent();
        string ObjPath = "Assets/Resources/" + objre.name + "ss.mat";
        
        if (AssetDatabase.LoadAssetAtPath(ObjPath) != null)
            AssetDatabase.DeleteAsset(ObjPath);
        
        AssetDatabase.CreateAsset(new Material(objre.material), ObjPath);

其中我们找到Gameobject然后把他的材质复制到我们制定的位置。
但是这里有一点一定要注意的是,如果直接这样写
AssetDatabase.CreateAsset(objre.material, ObjPath);
就会报错提示你这个加载方式可能涉及到泄露问题提示你使用MeshRenderer里的ShaderMaterial

AssetDataBase0.png

当你换上MeshRenderer就会报错提示你这是已有资产

AssetDataBase1.png

所以你需要new一个新的给他这样才不会报错。
还需要注意的是官方对于CreateAsset的说明是这样的

Creates a new asset at path.

You must ensure that the path uses a supported extension ('.mat' for materials, '.cubemap' for cubemaps, '.GUISkin' for skins, '.anim' for animations and '.asset' for arbitrary other assets.)
意思就是你只能生成'.mat'或者'.cubemap' '.GUISkin' '.anim' 这些后缀。

LoadAssetAtPath()
使用这个方法我们可以从本地读取一个文件加载到游戏中。

AssetDatabase.LoadAssetAtPath("Assets/Resources/cube.prefab");

DeleteAsset()
使用这个方法我们删除本地里的文件,例如打包的时候我们需要删除一些之前的旧文件或者是不想出现的文件可以这样。

if (AssetDatabase.LoadAssetAtPath(ObjPath) != null)
            AssetDatabase.DeleteAsset(ObjPath);

SaveAssets()
在Unity编辑器中我们修改完一些资源的属性并不会立刻的保存到硬盘中,而是标记已修改。
这个时候我们可以调用这个方法会立刻保存unity编辑器的资源到硬盘上。
这样做的目的是保证打包时打包的资源都是我们正确保存好的资源。

 AssetDataBase.SaveAssets(); 

Refresh()
重新更新修改过的资源显示在编辑器里,例如你del一个mat过后调用一下refresh立刻刷新。就像我们刷新桌面那种感觉。

 AssetDataBase.Refresh();

FindAssets()
从项目中找到指定的资产,返回的是GUID字符串数组。它本质就是一个字符串筛选器,可以通过一些参数搜索到对应的资产。
比如只用名称如下图:

string[] strList = AssetDatabase.FindAssets("btn");
for (int i = 0; i < strList.Length; i++)
  Debug.Log("btn=> " + i + "  " + AssetDatabase.GUIDToAssetPath(strList[i]));
AssetDataBase2.png

这里需要注意的是它是三个字符串为btn去查找且是连续的。

也可以中间加空格代表第二个关键词

strList = AssetDatabase.FindAssets("btn _");
for (int i = 0; i < strList.Length; i++)
  Debug.Log("btn _=> " + i + "  " + AssetDatabase.GUIDToAssetPath(strList[i]));

strList = AssetDatabase.FindAssets("btn _ C");
for (int i = 0; i < strList.Length; i++)
  Debug.Log("btn _ C=> " + i + "  " + AssetDatabase.GUIDToAssetPath(strList[i]));
AssetDataBase3.png
AssetDataBase4.png

有几个空格就有几个关键词。

还有一种写法是带路径,那么搜索范围就不是整个项目,而是你指定的路径那么效率将大大提升

string[] path = {"Assets/Resources", "Packages"};
strList = AssetDatabase.FindAssets("btn _", path);
for (int i = 0; i < strList.Length; i++)
  Debug.Log("btn _=> " + i + "  " + AssetDatabase.GUIDToAssetPath(strList[i]));

这样路径就对应的指定到Assets文件下的Resources里去找btn _的关键字的资产,同理也在Packages下去找。

还有一种是使用标签的方式去寻找资产,其中FindAssets中有两个标签:
第一种是l标签, 写法是

AssetDataBase.FindAssets("l:(你的标签)");

Labels: Assets can have labels attached to them. Assets with particular labels can be found use the keyword 'l:' before each label. This indicates that the string is searching for labels.
(有道翻译= =)
标签:资产可以附加标签。可以在每个标签前使用关键字“l:”找到具有特定标签的资产。这表示字符串正在搜索标签。
大概就是你可以为你的资产添加一个标签,那么在寻找的时候你就可以通过标签去找到他们,如果你没有给这些资产去设置标签的话, 那就找不到对应的资产。

Debug.Log("l: cube 搜索开始");
string[] strList2 = AssetDatabase.FindAssets("l:cube");
for (int i = 0; i < strList2.Length; i++)
  Debug.Log("2:  " +  i + "  " + AssetDatabase.GUIDToAssetPath(strList2[i]));
Debug.Log("l: cube 结束");
AssetDataBase5.png

这里我没设置标签 所以通过标签cube搜索不到任何资产。
如果我给一个cube.prefab设置标签在通过下列代码就可以找到正确的资源

 GameObject duixaing = AssetDatabase.LoadAssetAtPath("Assets/Cube.prefab");
        string []labels = { "cube" };

        AssetDatabase.SetLabels(duixaing, labels);
        Debug.Log("l: cube 搜索开始");
        string[] strList2 = AssetDatabase.FindAssets("l:cube");
        for (int i = 0; i < strList2.Length; i++)
            Debug.Log("2:  " +  i + "  " + AssetDatabase.GUIDToAssetPath(strList2[i]));
        Debug.Log("l: cube 结束");
AssetDataBase6.png

同时标签寻找的方式也是可以增加关键字在后面 达到缩小范围筛选的目的

AssetDatabase.FindAssets("l:cube Ca");

第二种是t标签, 写法是

AssetDataBase.FindAssets("t:(你的标签)");

Types: Find assets based on explicitly identified types. The keyword 't:' is used as a way to specify that typed assets are being looked for. If more than one type is included in the filter string then assets that match one class will be returned. Types can either be builtin types such as Texture2D or user created script classes. User created classes are assets created from a ScriptableObject class in the project. If all assets are wanted use Object as all assets derive from Object. Specifying one or more folders using the searchInFolders argument will limit the searching to these folders and their child folders. This is faster than searching all assets in all folders.
(有道翻译)
类型:根据显式标识的类型查找资产。关键字“t:”用于指定正在查找的类型化资产。如果过滤器字符串中包含多个类型,那么将返回与一个类匹配的资产。类型可以是内置类型(如Texture2D),也可以是用户创建的脚本类。用户创建的类是从项目中的ScriptableObject类创建的资产。如果需要所有资产,则使用Object作为从Object派生的所有资产。使用searchInFolders参数指定一个或多个文件夹将限制搜索这些文件夹及其子文件夹。这比在所有文件夹中搜索所有资产要快。

简单来说就是t标签是类型,他可以根据类型来给你快速的筛选出目标群体,同时也是支持关键字再次缩小范围

string[] path = {"Assets/Resources", "Packages"};
strList = AssetDatabase.FindAssets("t:texture2D btn", path);
for (int i = 0; i < strList.Length; i++)
  Debug.Log(i + "  " + AssetDatabase.GUIDToAssetPath(strList[i]));
AssetDataBase7.png

其中类型可以是prefab texture2D material还有其他的一些大家可以试试看。

你可能感兴趣的:(Unity里的AssetDataBase简单介绍)