版本: Unity 6 (6000.0)
语言英语
  • C#

AssetDatabase.FindAssets

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们不能接受所有提交的内容,但我们会阅读用户提出的每一个建议更改,并在适用的情况下进行更新。

关闭

提交失败

由于某种原因,您的建议更改无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

声明

public static string[] FindAssets(string filter);

声明

public static string[] FindAssets(string filter, string[] searchInFolders);

参数

filter 过滤器字符串可以包含搜索数据。有关此字符串的详细信息,请参见下文。
searchInFolders 搜索将开始的文件夹。

返回值

string[] 匹配的资产数组。请注意,将返回 GUID。如果没有找到匹配的资产,则返回空数组。

描述

使用搜索过滤器字符串搜索资产数据库。

FindAssets 允许您搜索资产。The string 参数可以提供名称、标签或类型(类名)。过滤器字符串可以包含

名称: 按资产文件名(不含扩展名)过滤资产。用空格分隔的词语将被视为单独的名称搜索。例如,"test asset" 是要搜索的资产的名称。请注意,名称可用于标识资产。此外,过滤器中使用的名称string 可以指定为子部分。例如,上面的 test asset 示例可以使用 test 来匹配。

标签 (l:): 资产可以有标签附加在它们身上。可以使用关键字 'l:' 在每个标签之前找到具有特定标签的资产。这表示字符串正在搜索标签。

类型 (t:): 根据明确标识的类型查找资产。关键字 't:' 用于指定正在查找的类型化资产。如果过滤器 string 中包含多个类型,则将返回匹配一个类的资产。类型可以是内置类型,例如 Texture2D,也可以是用户创建的脚本类。用户创建的类是项目中从 ScriptableObject 类创建的资产。如果需要所有资产,请使用 Object,因为所有资产都派生自 Object。通过使用 searchInFolders 参数指定一个或多个文件夹将限制搜索范围,仅限于这些文件夹及其子文件夹。这比搜索所有文件夹中的所有资产更快。

AssetBundles (b:): 查找属于 Asset bundle 的资产。关键字 'b:' 用于确定 Asset bundle 名称是否应为查询的一部分。

区域 (a:) : 查找项目特定区域中的资产。有效值为 "all""assets""packages"。使用此功能可以利用 'a:' 关键字后跟区域名称来使查询更具体,从而加快搜索速度。

通配符 (glob:): 使用通配符来匹配特定规则。关键字 glob: 后面跟着查询。例如,glob:Editor 将找到项目中的所有 Editor 文件夹,glob:(Editor|Resources) 将找到项目中的所有 Editor 和 Resources 文件夹,glob:Editor/* 将返回项目中 Editor 文件夹内的所有资产,而 glob:Editor/** 将递归地返回 Editor 文件夹内的所有资产。

注意
搜索不区分大小写。

使用 AssetDatabase.GUIDToAssetPath 获取资产路径,使用 AssetDatabase.LoadAssetAtPath 加载资产。

using UnityEngine;
using UnityEditor;

public class Example { [MenuItem("Example/FindAssets Example")] static void ExampleScript() { // Find all assets labelled with 'architecture' : string[] guids1 = AssetDatabase.FindAssets("l:architecture", null);

foreach (string guid1 in guids1) { Debug.Log(AssetDatabase.GUIDToAssetPath(guid1)); }

// Find all Texture2Ds that have 'co' in their filename, that are labelled with 'architecture' and are placed in 'MyAwesomeProps' folder string[] guids2 = AssetDatabase.FindAssets("co l:architecture t:texture2D", new[] {"Assets/MyAwesomeProps"});

foreach (string guid2 in guids2) { Debug.Log(AssetDatabase.GUIDToAssetPath(guid2)); } } }

以下脚本示例演示如何定位添加到资产的名称、标签和类型详细信息。The FindAssets 函数的示例。在此示例中创建的资产使用 ScriptObj 类。

// This script file has two CS classes.  The first is a simple Unity ScriptableObject script.
// The class it defines is used by the Example class below.
// (This is a single Unity script file. You could split this file into a ScriptObj.cs and an
// Example.cs file which is more structured.)

using UnityEngine; using UnityEditor; using System.IO;

public class ScriptObj : ScriptableObject { public void Awake() { Debug.Log("ScriptObj created"); } }

// Use ScriptObj to show how AssetDabase.FindAssets can be used

public class Example { static ScriptObj testI; static ScriptObj testJ; static ScriptObj testK;

[MenuItem("Examples/FindAssets Example two")] static void ExampleScript() { CreateAssets(); NamesExample(); LabelsExample(); TypesExample(); }

static void CreateAssets() { if (!Directory.Exists("Assets/AssetFolder")) { AssetDatabase.CreateFolder("Assets", "AssetFolder"); }

if (!Directory.Exists("Assets/AssetFolder/SpecialFolder")) { AssetDatabase.CreateFolder("Assets/AssetFolder", "SpecialFolder"); }

testI = (ScriptObj)ScriptableObject.CreateInstance(typeof(ScriptObj)); AssetDatabase.CreateAsset(testI, "Assets/AssetFolder/testI.asset");

testJ = (ScriptObj)ScriptableObject.CreateInstance(typeof(ScriptObj)); AssetDatabase.CreateAsset(testJ, "Assets/AssetFolder/testJ.asset");

// create an asset in a sub-folder and with a name which contains a space testK = (ScriptObj)ScriptableObject.CreateInstance(typeof(ScriptObj)); AssetDatabase.CreateAsset(testK, "Assets/AssetFolder/SpecialFolder/testK example.asset");

// an asset with a material will be used later Material material = new Material(Shader.Find("Standard")); AssetDatabase.CreateAsset(material, "Assets/AssetFolder/SpecialFolder/MyMaterial.mat"); }

static void NamesExample() { Debug.Log("*** FINDING ASSETS BY NAME ***");

string[] results;

results = AssetDatabase.FindAssets("testI"); foreach (string guid in results) { Debug.Log("testI: " + AssetDatabase.GUIDToAssetPath(guid)); }

results = AssetDatabase.FindAssets("testJ"); foreach (string guid in results) { Debug.Log("testJ: " + AssetDatabase.GUIDToAssetPath(guid)); }

results = AssetDatabase.FindAssets("testK example"); foreach (string guid in results) { Debug.Log("testK example: " + AssetDatabase.GUIDToAssetPath(guid)); }

Debug.Log("*** More complex asset search ***");

// find all assets that contain test (which is all assets) results = AssetDatabase.FindAssets("test"); foreach (string guid in results) { Debug.Log("name:test - " + AssetDatabase.GUIDToAssetPath(guid)); } }

static void LabelsExample() { Debug.Log("*** FINDING ASSETS BY LABELS ***");

string[] setLabels;

setLabels = new string[] { "wrapper" }; AssetDatabase.SetLabels(testI, setLabels);

setLabels = new string[] { "bottle", "banana", "carrot" }; AssetDatabase.SetLabels(testJ, setLabels);

setLabels = new string[] { "swappable", "helmet" }; AssetDatabase.SetLabels(testK, setLabels);

// label searching: // testI has wrapper, testK has swappable, so both have 'app' // testJ has bottle, so have a label searched as 'bot' string[] getGuids = AssetDatabase.FindAssets("l:app l:bot"); foreach (string guid in getGuids) { Debug.Log("label lookup: " + AssetDatabase.GUIDToAssetPath(guid)); } }

static void TypesExample() { Debug.Log("*** FINDING ASSETS BY TYPE ***");

string[] guids;

guids = AssetDatabase.FindAssets("t:material"); foreach (string guid in guids) { Debug.Log("Material: " + AssetDatabase.GUIDToAssetPath(guid)); }

guids = AssetDatabase.FindAssets("t:Object l:helmet"); foreach (string guid in guids) { Debug.Log("ScriptObj+helmet: " + AssetDatabase.GUIDToAssetPath(guid)); } } }