Интерактивные объекты — MRTK3

MRTK основывается на XRBaseInteractable, предоставленном набором средств взаимодействия XR Unity. Существующие поведение взаимодействующих объектов и API полностью поддерживаются в MRTK, и все наши пользовательские взаимодействующие объекты подчиняются взаимодействующему объекту XRI API.

Разработчикам, не знакомым с XRI, настоятельно рекомендуется сначала ознакомиться с документацией по архитектуре XRI в Unity.

Чтобы расширить возможности взаимодействия, включенные в XRI, MRTK предлагает два базовых класса, на основе которых можно создавать расширенные взаимодействия, где один расширяет другой.

Interactables inheritance diagram

  • MRTKBaseInteractable : XRBaseInteractable
    • Этот класс предлагает фильтрацию и пометку для различных типов интеракторов. Хотя базовый XRBaseInteractable XRI не различает типы объектов interactor, MRTKBaseInteractable предоставляет удобные функции для проверки того, возникают ли распространенные типы взаимодействий. Удобные возможности, такие как IsGazeHovered или IsGrabSelected являются ярлыками для запроса о том, реализует ли участвующий интерактор данный интерфейс (соответственно IGazeInteractor или IGrabInteractor). Эти флажки являются более производительными, чем итерацию по списку interactorsHovering или interactorsSelecting. Кроме того, MRTKBaseInteractable может фильтровать или отклонять определенные типы объектов interactor, если разработчик хочет исключить определенные входные модальности.
  • StatefulInteractable : MRTKBaseInteractable
    • Хотя MRTKBaseInteractable добавляет флаги и фильтры и позволяет избежать добавления дополнительного состояния в интерактивный объект, StatefulInteractable предоставляет полезные функции с отслеживанием состояния, такие как переключение и выбор переменных.

Строгое разделение состояния и визуальных элементов

В MRTK 2.x взаимодействующие объекты часто отвечали за управление собственными визуальными эффектами, будь то сжатие трехмерной кнопки, эффект наведения или даже просто изменение цвета по клику. Ограничение этого подхода заключается в том, что логика взаимодействия тесно связана с визуальными элементами. Если вы переработаете визуальные элементы или измените размер, форму, смещение и другие характеристики кнопки, скрипт взаимодействия также потребуется изменить.

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

Strict isolation of state and visuals

Этот же скрипт PressableButton можно использовать для создания "мягкого мяча" или похожей на тачпад панели, а также абстрактного элемента с возможностью нажатия, который выдает сетевые события при нажатии. Сценарию PressableButton безразлично то, «где» он находится; он может находиться внутри холста или на жестком корпусе.

Для управления визуальными элементами используется отдельный "визуальный драйвер" для опроса состояния взаимодействующих объектов и отображения соответствующей обратной связи. StateVisualizer — это рекомендуемый метод минимального кода для стимулирования общих визуальных эффектов обратной связи из состояния взаимодействующего объекта, но разработчики могут создавать собственные пользовательские драйверы визуальных элементов. Например, наши компоненты кнопки обычно используют StateVisualizer для расширенных трехмерных эффектов обратной связи на основе шейдеров, но мы также предоставляем пример BasicPressableButtonVisuals, показывающий, как можно создать простой визуальный драйвер с помощью кода.

переменные, выбор

Наиболее полезной дополнительной функцией StatefulInteractable по сравнению с базовыми функциями XRI является поддержка переменной Selectedness. Независимо от того, выбраны базовые взаимодействующие объекты XRI или нет, StatefulInteractable MRTK могут быть любой дробью с плавающей запятой от выбранного.

Эта концепция полезна при работе в XR, так как почти все формы входных данных больше не являются двоичными состояниями. Контроллеры движения часто имеют аналоговые триггеры (или аналоговые захваты!), взаимодействия с руками могут обеспечить переменное "сжимание", а взаимодействие с объемным нажатием может вывести из состояния нажатия кнопку или поверхность с возможностью нажатия посредством варьирования величины. Эти переменные и аналоговые взаимодействия используются везде в XR, а MRTK оснащен таким образом, чтобы помочь разработчикам создавать комфортные взаимодействия на основе этих аналоговых входных данных.

Широкий спектр различных интеракторов и типов взаимодействий может способствовать обще выделенности взаимодействующего объекта. В частности, все интеракторы, реализующие IVariableSelectInteractor, вносят свою аналоговую величину выбора, обычно через max() всех участвующих интеракторов. Эта переменная объединяется с двоичными, непеременными выборами, поступающими от мягких интеракторов.

Для производных классов, таких как PressableButton, функция Selectedness() переопределяется, чтобы добавить дополнительный "ингредиент" в вычисление выделяемой функциональности. Объекты interactor, которые реализуют IPokeInteractor, могут реализовывать возможность выбора на основе их физического расположения и того, как они физически влияют на интерактивный объект. Другие производные классы могут вводить другие произвольные формы выделения.

Variable selectedness

Для предоставляемых MRTK интерактивных объектов Selectedness() и isSelected всегда будут "соглашаться", т. е. вы никогда не будете видеть Selectedness() больше SelectThreshold без соответствующего isSelected XRI и сопровождающего объекта interactor в interactorsSelecting.

Важно!

Ваши пользовательские подклассы интерактивных объектов могут явно переопределить Selectedness на другое значение, которое совершенно не связано с isSelected XRI. Но наши интерактивные объекты не делают этого, поэтому мы настоятельно не рекомендуем это. В целом, никогда не записывайте взаимодействия, которые не имеют соответствующего интерактора. Выбор XRI в подавляющем большинстве случаев будет достаточным, и любые пользовательские взаимодействия, которые вы создаете, должны быть написаны как интеракторы.

При создании настраиваемого интерактивного объекта, поддерживающего новый метод определения Selectedness(), просто переопределите метод и объедините новую возможность выбора с существующим объемом выбора. Если вы используете StateVisualizer или какой-либо другой визуальный слой, прослушивающий выбор переменных, он будет реагировать соответствующим образом на новый тип выбора.

Сопоставление событий UGUI с XRI

В некоторых случаях желательно, чтобы интерактивные объекты реагировали на события UGUI, такие ввод с мыши, геймпада или сенсорного экрана. , UGUIInputAdapterкоторый является Selectable UGUI, получает события UGUI и перенаправляет их в CanvasProxyInteractor, если он присутствует.

UGUI adapter flow

CanvasProxyInteractor при получении уведомления о событиях UGUI от UGUIInputAdapter выдает действия эквивалентные XRI для соответствующего взаимодействующего элемента. Сопоставление входных данных UGUI и действий XRI допускает некоторые потери и является областью активной разработки.

Благодаря этой системе существующие взаимодействия XRI, созданные для иммерсивных платформ, рук, контроллеров движения и трехмерных входов, могут реагировать одинаково хорошо на доступные двухмерные элементы управления, такие как мышь и геймпад.