Sous-systèmes — MRTK3

MRTK3 tire parti de l’infrastructure de gestion de sous-système Unity XR pour écrire des modules extensibles susceptibles d’aider à fournir une prise en charge multiplateforme pour des fonctionnalités telles que la voix et le suivi des mains. Ces sous-systèmes sont initialisés et chargés par Unity, en plus des sous-systèmes natifs Unity existants comme XRMeshSubsystem et XRInputSubsystem. Consultez la documentation sur le fonctionnement des sous-systèmes Unity.

Philosophie

Dans MRTK v2, les « services » fournissaient une grande partie des fonctionnalités dans la scène-même. Elles instanciaient des objets, déplaçaient des objets, mettaient à jour la hiérarchie de scène, etc. Dans MRTK3, les sous-systèmes ne modifient pas explicitement la scène. Les sous-systèmes MRTK3 sont des fournisseurs modulaires de données, d’informations ou d’événements, ou effectuent des calculs pour les utilisateurs finaux. Si quelque chose dans la scène doit changer ou faire l’objet d’une action en fonction de l’entrée de données, il doit y avoir un composant visualiseur distinct basé sur la scène pour agir sur les données. Ce fractionnement garantit que les sous-systèmes ne sont pas destructeurs concernant les changements de scène, et ne provoquent pas d’effets secondaires liés à la scène.

Alors que MRTK v2 utilisait librement des systèmes et services pour le traitement des entrées, MRTK3 utilise généralement OpenXR et le système d’entrée Unity pour l’entrée multiplateforme. Toutefois, certains types de données ne sont pas encore encapsulés par le système d’entrée. Dans ces cas, nous fournissons des interfaces multiplateformes via nos sous-systèmes.

Cycle de vie de sous-système MRTK

Les définitions de sous-systèmes incluses dans l’infrastructure de Unity offrent des méthodes de cycle de vie simples telles que Start, Stop et Destroy. Nous étendons cette définition pour ajouter des méthodes de cycle utiles, comme Update, LateUpdate et FixedUpdate. Notre MRTKLifecycleManager gère des sous-systèmes qui implémentent notre interface de cycle de vie. Ce gestionnaire de cycle de vie est le seul MonoBehaviour impliqué dans l’architecture de sous-système. Il peut être placé n’importe où dans la scène, mais nous le laissons généralement quelque part sur la plateforme.

Interrogation

L’interrogation d’une implémentation de sous-système est simple et performante.

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

Descripteurs

Différentes implémentations d’un sous-système peuvent avoir différentes fonctionnalités. Par exemple, les différentes implémentations du HandsSubsystem peuvent spécifier leur capacité à signaler des données physiques ou des données synthétisées. Ces informations de fonctionnalité sont stockées dans le descripteur du sous-système, et peuvent être interrogées pour toute implémentation donnée.

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

Profils

À ne pas confondre avec les profils de MRTK 2.x, les profils de sous-système MRTK3 sont une ressource de plateforme par déploiement qui définit les sous-systèmes qui sont créés et démarrés.

Profils de sous-système, comme indiqué dans l’affichage des paramètres du projet MRTK.

Les sous-systèmes dont la case est cochée sont créés et démarrés par le MRTKLifecycleManager, et ont leurs méthodes de cycle de vie appelées. Différents profils peuvent être attribués à différentes cibles de déploiement.

Les sous-systèmes indiqués ici sont déterminés par les packages que vous avez installés. Si un package n’est pas installé, les sous-systèmes associés à ce package ne s’affichent pas ici et la liste s’actualise automatiquement.

Un MRTKProfile prédéfini est fourni avec le package MRTK v3. Il s’agit d’une ressource immuable. Toutefois, si vous souhaitez créer une sélection personnalisée de sous-systèmes à exécuter, vous devriez créer votre ressource MRTKProfile au sein de votre projet.

Créer vos propres sous-systèmes MRTK

Configuration

Des objets de configuration peuvent être attribués à des sous-systèmes afin de personnaliser leur comportement.

Configuration d’un sous-système

Ces objets de configuration sont accessibles de partout via l’API XRSubsystemHelpers .

XRSubsystemHelpers.GetConfiguration<TConfig, TSubsystem>()

Les sous-systèmes définissent le type de configuration qui leur convient dans leur MRTKSubsystemAttribute. En plus de cela, l’attribut définit également plusieurs éléments de métadonnées, ainsi que les types concrets du fournisseur implémenté. Par exemple, il s’agit de l’attribut que le sous-système de l’agrégateur Mains MRTK utilise.

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

Comme pour les profils, des ressources de configuration par défaut sont fournies. Elles sont immuables et doivent être dupliquées dans votre projet pour être éditées. Vous pouvez également créer une ressource via le menu création de ressource.

Menu de création d’une ressource