Интерактивные объекты — MRTK3
MRTK основывается на XRBaseInteractable
, предоставленном набором средств взаимодействия XR Unity. Существующие поведение взаимодействующих объектов и API полностью поддерживаются в MRTK, и все наши пользовательские взаимодействующие объекты подчиняются взаимодействующему объекту XRI API.
Разработчикам, не знакомым с XRI, настоятельно рекомендуется сначала ознакомиться с документацией по архитектуре XRI в Unity.
Чтобы расширить возможности взаимодействия, включенные в XRI, MRTK предлагает два базовых класса, на основе которых можно создавать расширенные взаимодействия, где один расширяет другой.
MRTKBaseInteractable : XRBaseInteractable
- Этот класс предлагает фильтрацию и пометку для различных типов интеракторов. Хотя базовый
XRBaseInteractable
XRI не различает типы объектов interactor,MRTKBaseInteractable
предоставляет удобные функции для проверки того, возникают ли распространенные типы взаимодействий. Удобные возможности, такие какIsGazeHovered
илиIsGrabSelected
являются ярлыками для запроса о том, реализует ли участвующий интерактор данный интерфейс (соответственноIGazeInteractor
илиIGrabInteractor
). Эти флажки являются более производительными, чем итерацию по спискуinteractorsHovering
илиinteractorsSelecting
. Кроме того,MRTKBaseInteractable
может фильтровать или отклонять определенные типы объектов interactor, если разработчик хочет исключить определенные входные модальности.
- Этот класс предлагает фильтрацию и пометку для различных типов интеракторов. Хотя базовый
StatefulInteractable : MRTKBaseInteractable
- Хотя
MRTKBaseInteractable
добавляет флаги и фильтры и позволяет избежать добавления дополнительного состояния в интерактивный объект,StatefulInteractable
предоставляет полезные функции с отслеживанием состояния, такие как переключение и выбор переменных.
- Хотя
Строгое разделение состояния и визуальных элементов
В MRTK 2.x взаимодействующие объекты часто отвечали за управление собственными визуальными эффектами, будь то сжатие трехмерной кнопки, эффект наведения или даже просто изменение цвета по клику. Ограничение этого подхода заключается в том, что логика взаимодействия тесно связана с визуальными элементами. Если вы переработаете визуальные элементы или измените размер, форму, смещение и другие характеристики кнопки, скрипт взаимодействия также потребуется изменить.
В MRTK3 интерактивные элементы являются чистым состоянием и взаимодействием. Они не отображают какие-либо визуальные изменения или эффекты на основе внутреннего состояния. Это исключительно коллекция логики состояния и взаимодействия, которую можно легко переносить на другие настройки визуального представления.
Этот же скрипт PressableButton
можно использовать для создания "мягкого мяча" или похожей на тачпад панели, а также абстрактного элемента с возможностью нажатия, который выдает сетевые события при нажатии. Сценарию PressableButton
безразлично то, «где» он находится; он может находиться внутри холста или на жестком корпусе.
Для управления визуальными элементами используется отдельный "визуальный драйвер" для опроса состояния взаимодействующих объектов и отображения соответствующей обратной связи.
StateVisualizer
— это рекомендуемый метод минимального кода для стимулирования общих визуальных эффектов обратной связи из состояния взаимодействующего объекта, но разработчики могут создавать собственные пользовательские драйверы визуальных элементов. Например, наши компоненты кнопки обычно используют StateVisualizer
для расширенных трехмерных эффектов обратной связи на основе шейдеров, но мы также предоставляем пример BasicPressableButtonVisuals
, показывающий, как можно создать простой визуальный драйвер с помощью кода.
переменные, выбор
Наиболее полезной дополнительной функцией StatefulInteractable
по сравнению с базовыми функциями XRI является поддержка переменной Selectedness
. Независимо от того, выбраны базовые взаимодействующие объекты XRI или нет, StatefulInteractable
MRTK могут быть любой дробью с плавающей запятой от выбранного.
Эта концепция полезна при работе в XR, так как почти все формы входных данных больше не являются двоичными состояниями. Контроллеры движения часто имеют аналоговые триггеры (или аналоговые захваты!), взаимодействия с руками могут обеспечить переменное "сжимание", а взаимодействие с объемным нажатием может вывести из состояния нажатия кнопку или поверхность с возможностью нажатия посредством варьирования величины. Эти переменные и аналоговые взаимодействия используются везде в XR, а MRTK оснащен таким образом, чтобы помочь разработчикам создавать комфортные взаимодействия на основе этих аналоговых входных данных.
Широкий спектр различных интеракторов и типов взаимодействий может способствовать обще выделенности взаимодействующего объекта. В частности, все интеракторы, реализующие IVariableSelectInteractor
, вносят свою аналоговую величину выбора, обычно через max()
всех участвующих интеракторов. Эта переменная объединяется с двоичными, непеременными выборами, поступающими от мягких интеракторов.
Для производных классов, таких как PressableButton
, функция Selectedness()
переопределяется, чтобы добавить дополнительный "ингредиент" в вычисление выделяемой функциональности. Объекты interactor, которые реализуют IPokeInteractor
, могут реализовывать возможность выбора на основе их физического расположения и того, как они физически влияют на интерактивный объект. Другие производные классы могут вводить другие произвольные формы выделения.
Для предоставляемых MRTK интерактивных объектов Selectedness()
и isSelected
всегда будут "соглашаться", т. е. вы никогда не будете видеть Selectedness()
больше SelectThreshold
без соответствующего isSelected
XRI и сопровождающего объекта interactor в interactorsSelecting
.
Важно!
Ваши пользовательские подклассы интерактивных объектов могут явно переопределить Selectedness
на другое значение, которое совершенно не связано с isSelected
XRI. Но наши интерактивные объекты не делают этого, поэтому мы настоятельно не рекомендуем это. В целом, никогда не записывайте взаимодействия, которые не имеют соответствующего интерактора. Выбор XRI в подавляющем большинстве случаев будет достаточным, и любые пользовательские взаимодействия, которые вы создаете, должны быть написаны как интеракторы.
При создании настраиваемого интерактивного объекта, поддерживающего новый метод определения Selectedness()
, просто переопределите метод и объедините новую возможность выбора с существующим объемом выбора. Если вы используете StateVisualizer
или какой-либо другой визуальный слой, прослушивающий выбор переменных, он будет реагировать соответствующим образом на новый тип выбора.
Сопоставление событий UGUI с XRI
В некоторых случаях желательно, чтобы интерактивные объекты реагировали на события UGUI, такие ввод с мыши, геймпада или сенсорного экрана. , UGUIInputAdapter
который является Selectable
UGUI, получает события UGUI и перенаправляет их в CanvasProxyInteractor
, если он присутствует.
CanvasProxyInteractor
при получении уведомления о событиях UGUI от UGUIInputAdapter
выдает действия эквивалентные XRI для соответствующего взаимодействующего элемента. Сопоставление входных данных UGUI и действий XRI допускает некоторые потери и является областью активной разработки.
Благодаря этой системе существующие взаимодействия XRI, созданные для иммерсивных платформ, рук, контроллеров движения и трехмерных входов, могут реагировать одинаково хорошо на доступные двухмерные элементы управления, такие как мышь и геймпад.