Subsistemas

MRTK3 aprovecha la infraestructura de administración de subsistemas XR de Unity para escribir módulos extensibles que pueden ayudar a proporcionar compatibilidad multiplataforma con características como el seguimiento de voz y manos. Unity inicializa y carga estos subsistemas, junto con los subsistemas nativos de Unity existentes, como XRMeshSubsystem y XRInputSubsystem. Consulte la documentación sobre el funcionamiento de Unity.

Filosofía

En MRTK v2, "services" proporcionó gran parte de la funcionalidad en la propia escena. Crean instancias de objetos, mueven objetos, actualizan la jerarquía de la escena, etc. En MRTK3, los subsistemas no modifican explícitamente la escena. Los subsistemas MRTK3 son proveedores modulares de datos, información o eventos o realizan cálculos para los usuarios finales. Si algo de la escena debe cambiar o actuarse en función de la entrada de datos, debe haber un componente de visualizador basado en escena independiente para actuar sobre los datos. Esta división garantiza que los subsistemas no sean destructivos con respecto a los cambios de escena y no causen efectos secundarios relacionados con la escena.

Aunque MRTK v2 usaba sistemas y servicios liberalmente para procesar la entrada, MRTK3 generalmente usa OpenXR y el sistema de entrada de Unity para la entrada multiplataforma. Sin embargo, algunos tipos de datos aún no están encapsulados por el sistema de entrada. En estos casos, proporcionamos interfaces multiplataforma a través de nuestros subsistemas.

Ciclo de vida del subsistema MRTK

Las definiciones de subsistema que se incluyen con la infraestructura de Unity ofrecen métodos de ciclo de vida simples como Start, Stopy Destroy. Ampliamos esta definición para incluir métodos "tick" útiles, como Update, LateUpdatey FixedUpdate. Nuestros MRTKLifecycleManager subsistemas administran los subsistemas que implementan nuestra interfaz de ciclo de vida. Este administrador del ciclo de vida es el único MonoBehaviour implicado en la arquitectura del subsistema; esto se puede colocar en cualquier parte de la escena, pero generalmente tendemos a dejarlo en algún lugar de la plataforma.

Consultas

La consulta de una implementación del subsistema es sencilla y 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);

Descriptores de

Las distintas implementaciones de un subsistema pueden tener diferentes funcionalidades. Por ejemplo, las distintas implementaciones de HandsSubsystem pueden especificar su capacidad para notificar datos físicos o datos sintetizados. Esta información de funcionalidad se almacena en el descriptor del subsistema y se puede consultar para cualquier implementación determinada.

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

Profiles

No debe confundirse con los perfiles de MRTK 2.x, los perfiles del subsistema MRTK3 son un recurso por plataforma de implementación que define qué subsistemas se crean e inician.

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

Los subsistemas que tienen activada la casilla correspondiente se crearán e iniciarán mediante MRTKLifecycleManager, así como también se llamarán a sus métodos de ciclo de vida. Se pueden asignar distintos perfiles a distintos destinos de implementación.

Los subsistemas que se muestran aquí están determinados por los paquetes que ha instalado. Si un paquete no está instalado, los subsistemas asociados a ese paquete no se mostrarán aquí y la lista se actualizará automáticamente.

Hay un preproceso MRTKProfile proporcionado como parte del paquete v3. Es un bien inmutable. Sin embargo, si desea crear una selección personalizada de subsistemas para ejecutarse, debe crear el recurso MRTKProfile en el proyecto.

Create your own MRTK subsystems

Configuración

A los subsistemas se les pueden asignar objetos de configuración para personalizar su comportamiento.

Configuring a subsystem

Estos objetos de configuración son accesibles desde cualquier lugar a través de la XRSubsystemHelpers API.

XRSubsystemHelpers.GetConfiguration<TConfig, TSubsystem>()

Los subsistemas definen qué tipo de configuración es relevante para ellos en su MRTKSubsystemAttribute. Junto con esto, el atributo también define varias partes de metadatos, junto con los tipos concretos del proveedor implementado. Por ejemplo, este es el atributo que usa el subsistema del agregador de manos MRTK.

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

Al igual que con los perfiles, se proporcionan los recursos de configuración predeterminados. Son inmutables y deben duplicarse en el proyecto que se va a editar. También puede crear un nuevo recurso mediante el menú de creación de recursos.

New asset creation menu