Подсистемы

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 — это ресурс платформы развертывания, определяющий, какие подсистемы создаются и запускаются.

Subsystem profiles, as shown in the MRTK project settings view.

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

Приведенные здесь подсистемы определяются установленными пакетами. Если пакет не установлен, подсистемы, связанные с этим пакетом, не будут отображаться здесь, и список автоматически обновится.

В пакете версии 3 предварительно предоставлена предварительная версия MRTKProfile. Это неизменяемый ресурс. Однако если вы хотите создать настраиваемый выбор подсистем для запуска, необходимо создать ресурс MRTKProfile в проекте.

Create your own MRTK subsystems

Конфигурация

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

Configuring a subsystem

Эти объекты конфигурации доступны из любого места через 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))]

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

New asset creation menu