Подсистемы — MRTK3
MRTK3 использует инфраструктуру управления подсистемой XR Unity для написания расширяемых модулей, которые могут помочь обеспечить кроссплатформенную поддержку таких функций, как отслеживание речи и рук. Эти подсистемы инициализируются и загружаются Unity вместе с существующими подсистемами Unity, такими как XRMeshSubsystem
и XRInputSubsystem
. Изучите документацию о том, как работают подсистемы Unity.
Философия
В MRTK версии 2 "службы" предоставили большую часть функциональных возможностей в самой сцене. Они будут создавать экземпляры объектов, перемещать объекты, обновлять иерархию сцен и т. д. В MRTK3 подсистемы не изменяют сцену явным образом. Подсистемы MRTK3 являются модульными поставщиками данных, информации или событий или выполняют вычисления для конечных пользователей. Если что-то в сцене должно изменяться или выполняться на основе входных данных, для работы с данными должен быть отдельный компонент визуализатора на основе сцены. Это разделение гарантирует, что подсистемы являются неразрушительными в отношении изменений сцены и не вызывают побочных эффектов, связанных с сценой.
Хотя MRTK версии 2 использует системы и службы для обработки входных данных свободно, MRTK3 обычно использует OpenXR и систему входных данных Unity для кроссплатформенных входных данных. Однако некоторые типы данных еще не упакованы системой ввода. В таких случаях мы предоставляем кроссплатформенные интерфейсы через наши подсистемы.
Жизненный цикл подсистемы MRTK
Определения подсистемы, включенные в инфраструктуру Unity, предлагают простые методы жизненного цикла, такие как Start
, Stop
и Destroy
. Мы расширяем это определение, чтобы включить полезные методы "tick", такие как Update
, LateUpdate
и FixedUpdate
.
MRTKLifecycleManager
управляет подсистемами, реализующими наш интерфейс жизненного цикла. Этот диспетчер жизненного цикла является единственным MonoBehaviour, участвующим в архитектуре подсистемы. Он может быть размещен в любом месте сцены, но мы обычно оставляем его где-то на платформе.
Выполнение запроса
Запросы к реализации подсистемы просты и исполнительны.
// Gets the first valid implementation of T that is started and running.
T mySubsystem = XRSubsystemHelpers.GetFirstRunningSubsystem<T>();
// Gets the first valid implementation of T, even if it hasn't been started.
T mySubsystem = XRSubsystemHelpers.GetFirstSubsystem<T>();
// If multiple implementations of T are loaded, get all of them.
List<T> allOfThem = new List<T>();
GetAllRunningSubsystemsNonAlloc<T>(allOfThem);
Дескрипторы
Различные реализации подсистемы могут иметь разные возможности. Например, различные реализации HandsSubsystem
могут указывать их возможности для создания отчетов о физических данных или синтезированных данных. Эти сведения о возможностях хранятся в дескрипторе подсистемы и могут запрашиваться для любой конкретной реализации.
// Get the first running hands subsystem.
var handsSubsystem = XRSubsystemHelpers.GetFirstRunningSubsystem<HandsSubsystem>();
// If we found one...
if (handsSubsystem != null)
{
// Read the capability information off the implementation's descriptor.
bool isPhysicalData = handsSubsystem.subsystemDescriptor.IsPhysicalData;
}
Профили
Не следует путать с профилями MRTK 2.x, профили подсистемы MRTK3 — это ресурс платформы развертывания, определяющий, какие подсистемы создаются и запускаются.
Подсистемы, для которых установлен соответствующий флажок, будут созданы и запущены MRTKLifecycleManager
, при этом выполняется вызов их методов жизненного цикла. Различные профили можно назначить разным целевым объектам развертывания.
Приведенные здесь подсистемы определяются установленными пакетами. Если пакет не установлен, подсистемы, связанные с этим пакетом, не будут отображаться здесь, и список автоматически обновится.
В пакете MRTK версии 3 поставляется готовая предварительная версия MRTKProfile
. Это неизменяемый ресурс. Однако если вы хотите создать настраиваемый выбор подсистем для запуска, необходимо создать ресурс MRTKProfile
в проекте.
Конфигурация
Подсистемы можно назначить объектам конфигурации для настройки их поведения.
Эти объекты конфигурации доступны из любого места через API XRSubsystemHelpers
.
XRSubsystemHelpers.GetConfiguration<TConfig, TSubsystem>()
Подсистемы определяют, какой тип конфигурации относится к ним в их MRTKSubsystemAttribute
. Вместе с этим атрибут также определяет несколько фрагментов метаданных, а также конкретные типы реализованного поставщика. Например, это атрибут, который использует подсистема агрегатора рук MRTK.
[MRTKSubsystem(
Name = "com.microsoft.mixedreality.hands",
DisplayName = "MRTK Hands Aggregator Subsystem",
Author = "Microsoft",
ProviderType = typeof(MRTKAggregator),
SubsystemTypeOverride = typeof(MRTKHandsAggregatorSubsystem),
ConfigType = typeof(MRTKHandsAggregatorConfig))]
Как и в случае с профилями, предоставляются ресурсы конфигурации по умолчанию. Они неизменяемы и должны дублироваться в проекте для редактирования. Вы также можете создать новый ресурс с помощью меню создания ресурса.