Визуализатор состояния — MRTK3

Изображение сценария State Visualizer в окне Unity Inspector.

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

Философия

В MRTK3 мы применяем разделение состояния и визуальных элементов. Взаимодействующие элементы отвечают за их логику взаимодействия и состояние, однако они не предназначены для отрисовки собственных визуальных элементов или эффектов на основе их состояния. Мотивация к такому разделению заключается в том, что логику взаимодействия и состояния можно повторно использовать в нескольких визуальных контекстах, и что визуальную обратную связь и режиссуру взаимодействия можно настроить, не затрагивая базовое состояние или взаимодействие. Кроме того, намешивание состояний в визуальных элементах может привести к неуправляемому коду со сложными, трудно понятными связями между визуальными эффектами и взаимодействиями, которые они представляют.

В StateVisualizer в значительной степени состояние не учитывается. Он прослушивает связанный объект StatefulInteractable и выполняет граф IEffect на основе текущего состояния взаимодействия. В StateVisualizer применяется сложное состояние, такое как Selectedness и пассивное/активное намерение наведения. Некоторые эффекты могут реагировать на частичный выбор для создания красивых "аналоговых" эффектов в ответ на движение пользователя, сжатие или нажатие.

StateVisualizer частично основан на API воспроизводимых объектов Unity.

Использование

Добавьте StateVisualizer в взаимодействующий объект вместе с аниматором. Выберите состояние и добавьте нужные эффекты. Убедитесь, что задано свойство Interactable, если StateVisualizer не удается найти взаимодействие во время выполнения.

Важно!

Для аниматора НЕ требуется контроллер аниматора, за исключением случаев создания эффектов. StateVisualizer управляет аниматором напрямую через API воспроизводимых объектов. StateVisualizer позволяет избежать использования контроллеров AnimatorController для повышения производительности и удобства обслуживания.

Добавление эффекта

Создание анимаций с помощью StateVisualizer

StateVisualizer не использует AnimatorController, поэтому по умолчанию анимации нельзя просмотреть во время редактирования. Чтобы устранить это ограничение, создайте временный AnimatorController, содержащий соответствующие анимации, над которыми вы работаете, и укажите на него ссылку в аниматоре. Помните, что они не требуются во время выполнения и могут иметь нежелательные последствия для производительности, если их не удалить.

В MRTK имеется пример "AuthoringControllers", который мы используем для создания эффектов анимации с нашими компонентами. Вы можете дублировать наш пример в соответствии со своими потребностями.

Производительность

StateVisualizer обеспечивает оптимальную производительность, несмотря на использование аниматоров и анимаций Unity, которые в других контекстах могут влететь в копеечку при использовании в большом масштабе. Чтобы решить эти проблемы, StateVisualizer интеллектуально вычисляет аниматор и агрессивно сводит к минимуму время выполнения аниматора. Кроме того, API воспроизводимых объектов имеет значительно более высокую производительность, чем компьютеры с состоянием AnimatorController. Отсутствие контроллеров AnimatorController существенно упрощает систему StateVisualizer и повышает ее производительность в большом масштабе.

В настоящее время StateVisualizer опрашивает состояние интерактивного элемента, а не полагается на прослушиватели событий для реагирования только при необходимости. Эта часть StateVisualizer находится на этапе активной разработки и может быть изменена для прослушивателей событий для еще большего повышения производительности.

Произведенный эффект

Действие Описание
AnimationEffect

Представление инспектора AnimationEffect
В режиме OneShot при активации состояния воспроизводится конкретная анимация, а при его деактивации — та же анимация в обратном порядке. В режиме PlaybackTimeMatchesValue время воспроизведения анимации напрямую управляется дробным значением состояния (например, Selectedness для состояния Select).
TwoWayAnimationEffect

Представление инспектора TwoWayAnimationEffect
Аналогично режиму OneShot из AnimationEffect, однако в этом случае используются две отдельных анимации, по одному для каждого "направления".
GraphicTintEffect

Представление инспектора GraphicTintEffect
Окрашивает список компонентов Graphic в оттенок определенного цвета. У этого эффекта имеются те же параметры PlaybackMode, что и у AnimationEffect с аналогичными результатами (OneShot выполняет полный переход при изменении состояния, PlaybackTimeMatchesValue будет соответствовать ходу перехода к дробному значению состояния).

  • Переопределение: окрашивание целевых объектов в оттенки указанного цвета.
  • Аддитивное: смешивание цвета в существующий цвет.
  • Умножение: умножение нового цвета на существующий цвет.

    Эти операции смешивания также будут приводить к смешиванию поверх других оттенков или анимаций, которые в настоящее время имеются на графе StateVisualizer. Учтите, что если оттенки имеют разные начальные цвета, этот эффект оттенка может быть смешан неправильно. Используйте отдельные эффекты добавления оттенков для элементов с разными базовыми цветами.
  • SpriteTintEffect

    Представление инспектора SpriteTintEffect
    Выполняет ту же операцию, что и GraphicTintEffect, но только для SpriteRenderer.
    SpriteSwapEffect

    Представление инспектора SpriteSwapEffect
    Задает в качестве целевого объекта Image либо ActiveSprite, либо InactiveSprite, в зависимости от того, является ли состояние активным или неактивным. Полезно для переключения!
    SetTargetsActiveEffect

    Представление инспектора SetTargetsActiveEffect
    Включает или отключает список объектов GameObject в зависимости от того, является ли состояние активным или неактивным. Invert вызовет противоположное поведение.
    PlayableAssetEffect

    Представление инспектора PlayableAssetEffect
    StateVisualAsset — это объект ScriptableObject, который содержит повторно используемый воспроизводимый ресурс. Этот эффект подключит воспроизводимый ресурс к графу StateVisualizer. (Данная функция по-прежнему является экспериментальной и может быть изменена.)

    Пользовательские эффекты

    Большинство эффектов, которые не относятся к одному из уникальных типов эффектов, обычно можно создавать как AnimationEffect. Однако если требуется создать новый уникальный эффект без анимации, можно реализовать интерфейс IEffect или подкласс одного из существующих эффектов. Дополнительные сведения см. в справочнике по API IEffect.

    Настраиваемые состояния

    В будущем в StateVisualizer планируется реализовать поддержку настраиваемых состояний. Следите за новостями.