Subsistemas — MRTK3
O MRTK3 tira partido da infraestrutura de Gestão do Subsistema Unity XR para escrever módulos extensíveis que podem ajudar a fornecer suporte entre plataformas para funcionalidades como a voz e o controlo manual. Estes subsistemas são inicializados e carregados pelo Unity juntamente com os subsistemas nativos do Unity existentes, como XRMeshSubsystem
e XRInputSubsystem
. Veja a documentação sobre como funcionam os subsistemas do Unity.
Filosofia
No MRTK v2, os "serviços" forneceram grande parte da funcionalidade no próprio cenário. Instanciariam objetos, movevam objetos, atualizavam a hierarquia de cenários, etc. No MRTK3, os subsistemas não modificam explicitamente a cena. Os subsistemas MRTK3 são fornecedores modulares de dados, informações ou eventos ou realizam cálculos para utilizadores finais. Se algo na cena tiver de ser alterado ou processado com base na entrada de dados, tem de existir um componente de visualização baseado em cena separado para agir sobre os dados. Esta divisão garante que os subsistemas não são destrutivos em relação às alterações de cena e não causam efeitos colaterais relacionados com a cena.
Embora o MRTK v2 tenha utilizado sistemas e serviços liberalmente para o processamento de entrada, o MRTK3 utiliza geralmente o OpenXR e o Sistema de Entrada do Unity para entrada entre plataformas. No entanto, alguns tipos de dados ainda não estão encapsulados pelo Sistema de Entrada. Nestes casos, fornecemos interfaces entre plataformas através dos nossos subsistemas.
Ciclo de vida do subsistema MRTK
As definições do subsistema incluídas na infraestrutura do Unity oferecem métodos de ciclo de vida simples, como Start
, Stop
e Destroy
. Alargamos esta definição para incluir métodos de "tick" úteis, tais como Update
, LateUpdate
e FixedUpdate
. A nossa MRTKLifecycleManager
gere subsistemas que implementam a nossa interface de ciclo de vida. Este gestor de ciclo de vida é o único MonoBehaviour envolvido na arquitetura do subsistema; isto pode ser colocado em qualquer lugar na cena, mas tendemos a deixá-lo em algum lugar na Plataforma.
A consultar
A consulta para uma implementação de subsistema é simples e eficaz.
// 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
As diferentes implementações de um subsistema podem ter capacidades diferentes. Por exemplo, as diferentes implementações do podem especificar a HandsSubsystem
sua capacidade para comunicar dados físicos ou dados sintetizados. Estas informações de capacidade são armazenadas no descritor do subsistema e podem ser consultadas para qualquer implementação específica.
// 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 confundir com os perfis do MRTK 2.x, os perfis de subsistema MRTK3 são um recurso por plataforma de implementação que define os subsistemas que são criados e iniciados.
Os subsistemas que têm a respetiva caixa de verificação correspondente selecionada serão criados e iniciados pelos MRTKLifecycleManager
métodos de ciclo de vida chamados. Podem ser atribuídos perfis diferentes a destinos de implementação diferentes.
Os subsistemas aqui apresentados são determinados pelos pacotes que instalou. Se um pacote não estiver instalado, os subsistemas associados a esse pacote não serão apresentados aqui e a lista é atualizada automaticamente.
Existe um pré-feito MRTKProfile
fornecido como parte do pacote MRTK v3. É um recurso imutável. No entanto, se quiser criar uma seleção personalizada de subsistemas para execução, deve criar o recurso MRTKProfile
no seu projeto.
Configuração
Os subsistemas podem ser atribuídos objetos de configuração para personalizar o respetivo comportamento.
Estes objetos de configuração são acessíveis a partir de qualquer lugar através da XRSubsystemHelpers
API.
XRSubsystemHelpers.GetConfiguration<TConfig, TSubsystem>()
Os subsistemas definem que tipo de configuração é relevante para eles no respetivo MRTKSubsystemAttribute
. Além disso, o atributo também define várias partes de metadados, juntamente com os tipos concretos do fornecedor implementado. Por exemplo, este é o atributo que o Subsistema agregador mãos do MRTK utiliza.
[MRTKSubsystem(
Name = "com.microsoft.mixedreality.hands",
DisplayName = "MRTK Hands Aggregator Subsystem",
Author = "Microsoft",
ProviderType = typeof(MRTKAggregator),
SubsystemTypeOverride = typeof(MRTKHandsAggregatorSubsystem),
ConfigType = typeof(MRTKHandsAggregatorConfig))]
Tal como acontece com os Perfis, são fornecidos os recursos de Configuração predefinidos. São imutáveis e têm de ser duplicados para o seu projeto para ser editado. Também pode criar um novo recurso através do menu de criação de recursos.