Unity 6.3
0 онлайн 79 гостей 3 в системе
Вход

SearchExpression

класс в UnityEditor.Search

Описание

Поисковые выражения позволяют добавить в язык поисковых запросов сложные запросы, которые перекликаются с несколькими провайдерами, например, для поиска всех объектов в сцене, которые используют некомпилируемый шейдер.

Поисковые выражения могут быть цеплены вместе для преобразования или выполнения набора манипуляций с элементами поиска.

В руководстве содержится пример Как использовать поисковое выражение.

Эти примеры показывают, как 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Псевдоним выражения. Это полезно для присвоения более читаемого результата математическому выражению (lile Count).
innerTextЭто внутренний текст выражения. Это означает текст без каких-либо специальных разделителей. Пример: выражение [1, 2, 3], которое является набором выражений, будет иметь innerText 1,2,3.
nameИмя функции оценщика или внешний текст. Это, как правило, поле для отладки.
outerTextЭто внешний текст выражения. Это означает полный текст с любыми специальными разделителями. Пример: выражение [1, 2, 3], которое является набором выражений, будет иметь outerText из [1,2,3].
parametersСписок параметров выражения. Обратите внимание, что каждый параметр является выражением сам по себе.
typesАгрегирование типов выражения. Этот метод используется в основном для проверки параметров выражения.

Открытые методы

Метод Описание
ExecuteВыполнить SearchEXpression, дающее определенный SearchContext В зависимости от флагов выражение может быть оценено в рабочем потоке (по умолчанию) или в главном потоке. Оно возвращает перечислимый список SearchItem.
GetBooleanValueПопробуйте проанализировать innerText и преобразовать его в логическое значение.
GetNumberValueПопробуйте проанализировать innerText и преобразовать его в двойное значение.
IsKeywordПроверьте, является ли innerText выражения встроенным SearchExpressionKeyword.
ToStringПреобразование выражения в строку.

Статические методы

Метод Описание
CheckВыполняет SearchExpression и проверяет, является ли внутреннее значение первого полученного SearchItem истинным — то есть не 0, не null, не "" и не false.
CreateIdСоздать уникальный идентификатор. Это полезно при создании нового SearchItem.
CreateItemСоздать новый SearchItem из значения с дополнительной меткой.
FormatItemВозьмите строку формата и замените все селекторы в ней на выбранные значения, полученные из SearchItem.
GetFormatStringИзвлекает строку формата из заданного выражения. Эту функцию следует использовать для извлечения строки формата из входного параметра SearchExpression. Например, вычислитель print{"this is it: @label"} принимает строку формата в качестве первого параметра.
IsTrueПроверяет, является ли внутреннее значение SearchItem истинным. То есть значение не равно 0, не null, не "" и не false.
ProcessValuesБерёт группу SearchItem и применяет к элементу функцию-преобразователь processHandler, чтобы задать его внутреннее значение или outputValueField. Учтите, что эти элементы обрабатываются в главном потоке, поэтому можно разрешать селекторы любого вида.
TryConvertToDoubleРазрешить селектор на элементе и попытаться преобразовать выбранное значение в двойное.