Subsistemas – MRTK3

O MRTK3 aproveita a infraestrutura de Gerenciamento de Subsistemas do Unity XR para gravar módulos extensíveis que podem ajudar a fornecer suporte multiplataforma para recursos como controle da fala e da mão. Esses subsistemas são inicializados e carregados pelo Unity, juntamente com os subsistemas nativos do Unity existentes, como XRMeshSubsystem e XRInputSubsystem. Consulte a documentação sobre como funciona o subsistema no Unity.

Filosofia

No MRTK v2, os "serviços" forneciam grande parte da funcionalidade na própria cena. Eles instanciavam objetos, moviam objetos, atualizavam a hierarquia de cena etc. No MRTK3, os subsistemas não modificam a cena explicitamente. Os subsistemas do MRTK3 são provedores modulares de dados, informações ou eventos ou executam a computação para usuários finais. Se algo na cena precisar ser alterado ou acionado com base na entrada de dados, deve haver um componente de visualizador baseado em cena separado para agir nos dados. Essa divisão garante que os subsistemas não sejam destrutivos em relação às alterações da cena e não causem efeitos colaterais relacionados à cena.

Embora o MRTK v2 tenha usado sistemas e serviços livremente para processar entradas, o MRTK3 geralmente usa o OpenXR e o Sistema de Entrada do Unity para entrada multiplataforma. No entanto, certos tipos de dados ainda não são encapsulados pelo Sistema de Entrada. Nesses casos, fornecemos interfaces multiplataforma por nossos subsistemas.

Ciclo de vida do subsistema do MRTK

As definições do subsistema incluídas na infraestrutura do Unity oferecem métodos simples de ciclo de vida, como Start, Stop e Destroy. Estendemos essa definição para incluir métodos úteis de "tique", como Update, LateUpdate e FixedUpdate. Nosso MRTKLifecycleManager gerencia subsistemas que implementam a interface de ciclo de vida. Esse gerenciador de ciclo de vida é o único MonoBehaviour envolvido na arquitetura do subsistema. Ele pode ser colocado em qualquer lugar da cena, mas geralmente ele fica em algum lugar no Rig.

Consultas

É simples e eficiente consultar uma implementação de subsistema.

// 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);

Descritores

Implementações diferentes de um subsistema podem ter funcionalidades diferentes. Por exemplo, as implementações diferentes de HandsSubsystem podem especificar sua capacidade para relatar dados físicos ou sintetizados. Essas informações de capacidade são armazenadas no descritor do subsistema e podem ser consultadas para qualquer implementação.

// 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;
}

Perfis

Para não ser confundido com os perfis do MRTK 2.x, os perfis de subsistema do MRTK3 são um ativo por plataforma de implantação que definem quais subsistemas são criados e iniciados.

Perfis de subsistema, conforme mostrado na exibição de configurações de projeto do MRTK.

Os subsistemas com a caixa de seleção correspondente marcada serão criados e iniciados pelo MRTKLifecycleManager. Além disso, os métodos do ciclo de vida serão chamados. Perfis diferentes podem ser atribuídos a diferentes destinos de implantação.

Os subsistemas mostrados aqui são determinados por quais pacotes você instalou. Se um pacote não tiver sido instalado, os subsistemas associados a esse pacote não serão mostrados aqui e a lista será atualizada automaticamente.

Há uma predefinição MRTKProfile fornecida dentro do pacote do MRTK v3. É um ativo imutável. No entanto, se você quiser criar uma seleção personalizada de subsistemas a serem executados, crie seu ativo MRTKProfile em seu projeto.

Criar seus próprios subsistemas MRTK

Configuração

Objetos de configuração podem ser atribuídos aos subsistemas para personalizar seu comportamento.

Configurando um subsistema

Esses objetos de configuração são acessíveis de qualquer lugar pela API XRSubsystemHelpers.

XRSubsystemHelpers.GetConfiguration<TConfig, TSubsystem>()

Os subsistemas definem qual tipo de configuração é relevante no MRTKSubsystemAttribute. Junto com isso, o atributo também define várias partes de metadados, juntamente com os tipos concretos do provedor implementado. Por exemplo, esse é o atributo que o Subsistema do Agregador de Mãos do MRTK usa.

[MRTKSubsystem(
        Name = "com.microsoft.mixedreality.hands",
        DisplayName = "MRTK Hands Aggregator Subsystem",
        Author = "Microsoft",
        ProviderType = typeof(MRTKAggregator),
        SubsystemTypeOverride = typeof(MRTKHandsAggregatorSubsystem),
        ConfigType = typeof(MRTKHandsAggregatorConfig))]

Assim como nos Perfis, os ativos de Configuração padrão são fornecidos. Eles são imutáveis e devem ser duplicados para o projeto a ser editado. Também é possível criar um novo ativo pelo menu de criação de ativos.

Menu de criação de novo ativo