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

SearchExpression

UnityEditor.Search 中的类

建议修改

成功!

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

关闭

提交失败

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

关闭

取消

描述

搜索表达式允许您添加到搜索查询语言中,以表达跨引用多个提供程序的复杂查询,例如,搜索场景中使用未编译着色器的所有对象。

搜索表达式可以链接在一起,以转换或对搜索项执行集合操作。

手册包含关于如何使用搜索表达式的示例。

这些示例展示了如何在评估器中使用 SearchExpression。

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using UnityEditor;
using UnityEditor.Search;
using UnityEngine;

public class SearchExpressionEvaluator_Example
{
    [SearchExpressionEvaluator(SearchExpressionType.Iterable | SearchExpressionType.Variadic)]
    [SearchExpressionEvaluatorSignatureOverload(SearchExpressionType.Number, SearchExpressionType.Iterable | SearchExpressionType.Variadic)]
    [Description("Extract and returns the X first results for each expression.")]
    public static IEnumerable<SearchItem> TakeXFirst(SearchExpressionContext c)
    {
        var argIndex = 0;
        var takeNumber = 1;
        if (c.args[0].types.HasFlag(SearchExpressionType.Number))
        {
            ++argIndex;
            takeNumber = Math.Max((int)(c.args[0].GetNumberValue(takeNumber)), 0);
        }

        for ( ; argIndex < c.args.Length; ++argIndex)
        {
            var iterable = c.args[argIndex].Execute(c);
            var taken = 0;
            foreach (var item in iterable)
            {
                if (item == null)
                    yield return null;
                else
                {
                    yield return item;
                    ++taken;
                    if (taken == takeNumber)
                    {
                        c.Break();
                        break;
                    }
                }
            }
        }
    }


    [MenuItem("Examples/ExpressionEvaluator/Take First")]
    static void TestTakeFirst()
    {
        var ctx = SearchService.CreateContext("takexfirst{[1,2,3,4], [34, 45, 66], t:script}");
        SearchService.ShowWindow(ctx);
    }

    [MenuItem("Examples/ExpressionEvaluator/Take 2 First")]
    static void TestTake2First()
    {
        var ctx = SearchService.CreateContext("takexfirst{2, [1,2,3,4], [34, 45, 66], t:script}");
        SearchService.ShowWindow(ctx);
    }

    [Description("Returns ids of current selection")]
    [SearchExpressionEvaluator(SearchExpressionEvaluationHints.ThreadNotSupported)]
    public static IEnumerable<SearchItem> SelectionIds(SearchExpressionContext c)
    {
        var instanceIds = UnityEditor.Selection.instanceIDs;
        foreach (var id in instanceIds)
        {
            yield return SearchExpression.CreateItem(id, c.ResolveAlias("selected id"));
        }
    }

    [MenuItem("Examples/ExpressionEvaluator/Selection ids")]
    static void SelectionIds()
    {
        var ctx = SearchService.CreateContext("selectionids{}");
        SearchService.ShowWindow(ctx);
    }

    [Description("Returns asset paths corresponding to a list of instance ids")]
    [SearchExpressionEvaluator("IdsToPaths", SearchExpressionEvaluationHints.ThreadNotSupported, SearchExpressionType.Iterable)]
    public static IEnumerable<SearchItem> IdsToPath(SearchExpressionContext c)
    {
        foreach (var idItem in c.args[0].Execute(c))
        {
            if (SearchExpression.TryConvertToDouble(idItem, out var idNum))
            {
                var id = (int)idNum;
                var path = AssetDatabase.GetAssetPath(id);
                if (!string.IsNullOrEmpty(path))
                {
                    yield return SearchExpression.CreateItem(path, c.ResolveAlias("asset path"));
                }
            }
        }
    }

    [MenuItem("Examples/ExpressionEvaluator/Selection ids to Paths")]
    static void IdsToPaths()
    {
        var ctx = SearchService.CreateContext("IdsToPaths{selectionids{}}");
        SearchService.ShowWindow(ctx);
    }

    [Description("Convert arguments to a string allowing you to format the result.")]
    [SearchExpressionEvaluator(SearchExpressionType.Selector | SearchExpressionType.Text, SearchExpressionType.Iterable | SearchExpressionType.Literal | SearchExpressionType.Variadic)]
    [SearchExpressionEvaluatorSignatureOverload(SearchExpressionType.Iterable | SearchExpressionType.Literal | SearchExpressionType.Variadic)]
    public static IEnumerable<SearchItem> FormatItems(SearchExpressionContext c)
    {
        var skipCount = 0;
        if (SearchExpression.GetFormatString(c.args[0], out var formatStr))
            skipCount++;
        var items = c.args.Skip(skipCount).SelectMany(e => e.Execute(c));
        var dataSet = SearchExpression.ProcessValues(items, null, item => SearchExpression.FormatItem(c.search, item, formatStr));
        return dataSet;
    }

    [MenuItem("Examples/ExpressionEvaluator/Get Script Paths")]
    static void GetScriptPaths()
    {
        var ctx = SearchService.CreateContext("formatitems{t:script search}");
        SearchService.ShowWindow(ctx);
    }
}

属性

alias表达式的别名。这对于为数学表达式分配更易读的结果很有用(如 Count)。
innerText这是表达式的内部文本。这意味着没有特殊分隔符的文本。例如:表达式 [1, 2, 3](这是一个集合表达式)的 innerText 为 1,2,3。
name评估器函数的名称或外部文本。这主要是一个调试字段。
outerText这是表达式的外部文本。这意味着包含任何特殊分隔符的完整文本。例如:表达式 [1, 2, 3](这是一个集合表达式)的 outerText 为 [1,2,3]。
parameters表达式的参数列表。请注意,每个参数本身就是一个表达式。
types表达式的聚合类型。这主要用于验证表达式的参数。

公共方法

Execute在给定的 SearchContext 中执行 SearchExpression。根据标志,表达式可能会在工作线程(默认)或主线程中进行评估。它返回一个可枚举的 SearchItem 列表。
GetBooleanValue尝试解析 innerText 并将其转换为布尔值。
GetNumberValue尝试解析 innerText 并将其转换为双精度值。
IsKeyword检查表达式的 innerText 是否为内置的 SearchExpressionKeyword。
ToString将表达式转换为字符串表示形式。

静态方法

Check执行 SearchExpression 并检查第一个产生的 SearchItem 的内部值是否为真值。非 0、非 null、非 "" 且非 false。
CreateId生成唯一的 ID。这在创建新的 SearchItem 时很有用。
CreateItem从具有可选标签的值创建新的 SearchItem。
FormatItem获取格式字符串,并将其中的所有选择器替换为从 SearchItem 中获得的选择值。
GetFormatString从给定表达式中提取格式字符串。此函数应用于从 SearchExpression 的输入参数中提取格式字符串。例如:评估器 print{"this is it: @label"} 将格式字符串作为其第一个参数。
IsTrue检查 SearchItem 的内部值是否为真值。这意味着该值不是 0、不是 null、不是 "" 且不是 false。
ProcessValues获取一组 SearchItem,并将 processHandler 变换器函数应用于该项,以设置其内部值或 outputValueField。请注意,这些项是在主线程中处理的,因此您可以解析任何类型的选择器。
TryConvertToDouble解析项上的选择器,并尝试将选定的值转换为双精度值。