Creazione di un provider di dati di sistema di input - MRTK2

Il sistema di input Realtà mista Toolkit è un sistema estendibile per abilitare il supporto dei dispositivi di input. Per aggiungere il supporto per una nuova piattaforma hardware, potrebbe essere necessario un provider di dati di input personalizzato.

Questo articolo descrive come creare provider di dati personalizzati, detti anche gestori di dispositivi, per il sistema di input. Il codice di esempio illustrato di seguito è tratto da WindowsMixedRealityDeviceManager.

Il codice completo usato in questo esempio è disponibile nella cartella MRTK/Providers/WindowsMixedReality.

Struttura di spazi dei nomi e cartelle

I provider di dati possono essere distribuiti come componente aggiuntivo di terze parti o come parte del Realtà mista Toolkit Microsoft. Il processo di approvazione per l'invio di nuovi provider di dati a MRTK varierà caso per caso e verrà comunicato al momento della proposta iniziale.

Importante

Se un provider di dati di sistema di input viene inviato al repository Realtà mista Toolkit, lo spazio dei nomi deve iniziare con Microsoft.MixedReality.Toolkit (ad esempio: Microsoft.MixedReality. Toolkit. WindowsMixedReality) e il codice devono trovarsi in una cartella sotto MRTK/Providers (ad esempio MRTK/Providers/WindowsMixedReality).

Spazio dei nomi

I provider di dati devono disporre di uno spazio dei nomi per attenuare potenziali conflitti di nomi. È consigliabile che lo spazio dei nomi includa i componenti seguenti.

  • Nome azienda
  • Area funzionale

Ad esempio, un provider di dati di input creato dalla società Contoso può essere "Contoso.MixedReality. Toolkit. Input".

È consigliabile disporre il codice sorgente per i provider di dati in una gerarchia di cartelle, come illustrato nell'immagine seguente.

Example folder structure

Dove ContosoInput contiene l'implementazione del provider di dati, la cartella Editor contiene il controllo (e qualsiasi altro codice specifico dell'editor Unity), la cartella Textures contiene immagini dei controller supportati e i profili contengono uno o più profili predefiniti.

Nota

Alcune immagini controller comuni sono disponibili nella cartella MixedRealityToolkit\StandardAssets\Textures.

Implementare il provider di dati

Specificare l'ereditarietà dell'interfaccia e/o della classe di base

Tutti i provider di dati del sistema di input devono implementare l'interfaccia IMixedRealityInputDeviceManager , che specifica la funzionalità minima richiesta dal sistema di input. La base MRTK include la BaseInputDeviceManager classe che fornisce un'implementazione predefinita di questa funzionalità necessaria. Per i dispositivi che si basano sulla classe UInput di Unity, la UnityJoystickManager classe può essere usata come classe di base.

Nota

Le BaseInputDeviceManager classi e UnityJoystickManager forniscono l'implementazione necessaria IMixedRealityInputDeviceManager .

public class WindowsMixedRealityDeviceManager :
    BaseInputDeviceManager,
    IMixedRealityCapabilityCheck
{ }

IMixedRealityCapabilityCheck viene usato da WindowsMixedRealityDeviceManager per indicare che fornisce il supporto per un set di funzionalità di input, in particolare, mani articolate, mani con movimento fisso e controller di movimento.

Applicare l'attributo MixedRealityDataProvider

Un passaggio chiave della creazione di un provider di dati di sistema di input consiste nell'applicare l'attributo MixedRealityDataProvider alla classe . Questo passaggio abilita l'impostazione del profilo predefinito e delle piattaforme per il provider, se selezionata nel profilo di sistema di input.

[MixedRealityDataProvider(
    typeof(IMixedRealityInputSystem),
    SupportedPlatforms.WindowsUniversal,
    "Windows Mixed Reality Device Manager")]
public class WindowsMixedRealityDeviceManager :
    BaseInputDeviceManager,
    IMixedRealityCapabilityCheck
{ }

Implementare i metodi IMixedRealityDataProvider

Dopo aver definito la classe, il passaggio successivo consiste nel fornire l'implementazione dell'interfaccia IMixedRealityDataProvider .

Nota

La BaseInputDeviceManager classe , tramite la BaseService classe , fornisce solo implementazioni vuote per IMixedRealityDataProvider i metodi. I dettagli di questi metodi sono in genere specifici del provider di dati.

I metodi che devono essere implementati dal provider di dati sono:

  • Destroy()
  • Disable()
  • Enable()
  • Initialize()
  • Reset()
  • Update()

Implementare la logica del provider di dati

Il passaggio successivo consiste nell'aggiungere la logica per la gestione dei dispositivi di input, inclusi i controller da supportare.

Implementare le classi controller

L'esempio WindowsMixedRealityDeviceManager di definisce e implementa le classi controller seguenti.

Il codice sorgente per ognuna di queste classi è disponibile nella cartella MRTK/Providers/WindowsMixedReality.

  • WindowsMixedRealityArticulatedHand.cs
  • WindowsMixedRealityController.cs
  • WindowsMixedRealityGGVHand.cs

Nota

Non tutti i gestori di dispositivi supporteranno più tipi di controller.

Applicare l'attributo MixedRealityController

Applicare quindi l'attributo MixedRealityController alla classe . Questo attributo specifica il tipo di controller (ad esempio, mano articolata), la mano (ad esempio, sinistra o destra) e un'immagine controller facoltativa.

[MixedRealityController(
    SupportedControllerType.WindowsMixedReality,
    new[] { Handedness.Left, Handedness.Right },
    "StandardAssets/Textures/MotionController")]
{ }

Configurare i mapping di interazione

Il passaggio successivo consiste nel definire il set di mapping di interazione supportati dal controller. Per i dispositivi che ricevono i dati tramite la classe Input di Unity, lo strumento di mapping del controller è una risorsa utile per confermare i mapping dell'asse e dei pulsanti corretti da assegnare alle interazioni.

L'esempio seguente è abbreviato dalla GenericOpenVRController classe , che si trova nella cartella MRTK/Providers/OpenVR.

public override MixedRealityInteractionMapping[] DefaultLeftHandedInteractions => new[]
{
    // Controller Pose
    new MixedRealityInteractionMapping(0, "Spatial Pointer", AxisType.SixDof, DeviceInputType.SpatialPointer, MixedRealityInputAction.None),
    // Left Trigger Squeeze
    new MixedRealityInteractionMapping(1, "Trigger Position", AxisType.SingleAxis, DeviceInputType.Trigger, ControllerMappingLibrary.AXIS_9),
    // Left Trigger Press (Select)
    new MixedRealityInteractionMapping(2, "Trigger Press (Select)", AxisType.Digital, DeviceInputType.TriggerPress, KeyCode.JoystickButton14),
};

Nota

La ControllerMappingLibrary classe fornisce costanti simboliche per l'asse di input e le definizioni dei pulsanti unity.

Generare eventi di notifica

Per consentire alle applicazioni di rispondere all'input dell'utente, il provider di dati genera eventi di notifica corrispondenti alle modifiche dello stato del controller, come definito nelle IMixedRealityInputHandler interfacce e IMixedRealityInputHandler<T> .

Per i controlli di tipo digitale (pulsante), generare gli eventi OnInputDown e OnInputUp.

// inputAction is the input event that is to be raised.
if (interactionSourceState.touchpadPressed)
{
    InputSystem?.RaiseOnInputDown(InputSource, ControllerHandedness, inputAction);
}
else
{
    InputSystem?.RaiseOnInputUp(InputSource, ControllerHandedness, inputAction);
}

Per i controlli analogici (ad esempio, la posizione del touchpad) deve essere generato l'evento InputChanged.

InputSystem?.RaisePositionInputChanged(InputSource, ControllerHandedness, interactionMapping.MixedRealityInputAction, interactionSourceState.touchpadPosition);

Aggiungere la strumentazione del profiler unity

Le prestazioni sono fondamentali nelle applicazioni di realtà mista. Ogni componente comporta un sovraccarico per cui le applicazioni devono tenere conto. A questo scopo, è importante che tutti i provider di dati di input contengano la strumentazione del profiler Unity nel ciclo interno e i percorsi di codice usati di frequente.

È consigliabile implementare il modello utilizzato da MRTK durante la strumentazione di provider personalizzati.

        private static readonly ProfilerMarker GetOrAddControllerPerfMarker = new ProfilerMarker("[MRTK] WindowsMixedRealityDeviceManager.GetOrAddController");

        private async void GetOrAddController(InteractionSourceState interactionSourceState)
        {
            using (GetOrAddControllerPerfMarker.Auto())
            {
                // Code to be measured.
            }
        }

Nota

Il nome usato per identificare il marcatore del profiler è arbitrario. MrTK usa il modello seguente.

"[product] className.methodName - nota facoltativa"

È consigliabile che i provider di dati personalizzati seguano un modello simile per semplificare l'identificazione di componenti e metodi specifici durante l'analisi delle tracce.

Creare il profilo e il controllo

Nel Realtà mista Toolkit i provider di dati vengono configurati usando i profili.

I provider di dati con opzioni di configurazione aggiuntive (ad esempio InputSimulationService) devono creare un profilo e un controllo per consentire ai clienti di modificare il comportamento in base alle esigenze dell'applicazione.

Il codice completo per l'esempio in questa sezione è disponibile in MRTK. Cartella Services/InputSimulation.

Definire il profilo

Il contenuto del profilo deve rispecchiare le proprietà accessibili dell'osservatore (ad esempio, intervallo di aggiornamento). Tutte le proprietà configurabili dall'utente definite in ogni interfaccia devono essere contenute con il profilo.

[CreateAssetMenu(
    menuName = "Mixed Reality Toolkit/Profiles/Mixed Reality Simulated Input Profile",
    fileName = "MixedRealityInputSimulationProfile",
    order = (int)CreateProfileMenuItemIndices.InputSimulation)]
public class MixedRealityInputSimulationProfile : BaseMixedRealityProfile
{ }

L'attributo CreateAssetMenu può essere applicato alla classe del profilo per consentire ai clienti di creare un'istanza del profilo usando il menu Crea > asset > Realtà mista Toolkit > profili.

Implementare il controllo

I controlli profilo sono l'interfaccia utente per la configurazione e la visualizzazione del contenuto del profilo. Ogni controllo profilo deve estendere la classe 'BaseMixedRealityToolkitConfigurationProfileInspector .

[CustomEditor(typeof(MixedRealityInputSimulationProfile))]
public class MixedRealityInputSimulationProfileInspector : BaseMixedRealityToolkitConfigurationProfileInspector
{ }

L'attributo CustomEditor indica a Unity il tipo di asset a cui si applica il controllo.

Creare definizioni di assembly

Il Realtà mista Toolkit usa file di definizione dell'assembly (con estensione asmdef) per specificare le dipendenze tra i componenti e per facilitare Unity nella riduzione del tempo di compilazione.

È consigliabile creare file di definizione dell'assembly per tutti i provider di dati e i relativi componenti dell'editor.

Usando la struttura di cartelle nell'esempio precedente, sono presenti due file con estensione asmdef per il provider di dati ContosoInput.

La prima definizione dell'assembly è per il provider di dati. Per questo esempio, verrà chiamato ContosoInput e si troverà nella cartella ContosoInput dell'esempio. Questa definizione di assembly deve specificare una dipendenza da Microsoft.MixedReality. Toolkit e qualsiasi altro assembly da cui dipende.

La definizione dell'assembly ContosoInputEditor specifica il controllo del profilo e qualsiasi codice specifico dell'editor. Questo file deve trovarsi nella cartella radice del codice dell'editor. In questo esempio il file si troverà nella cartella ContosoInput\Editor. Questa definizione di assembly conterrà un riferimento all'assembly ContosoInput e:

  • Microsoft.MixedReality. Toolkit
  • Microsoft.MixedReality. Toolkit. Editor.Inspectors
  • Microsoft.MixedReality. Toolkit. Editor.Utilities

Registrare il provider di dati

Dopo la creazione, il provider di dati può essere registrato con il sistema di input e può essere usato nell'applicazione.

Registered input system data providers

Creazione di pacchetti e distribuzione

I provider di dati distribuiti come componenti di terze parti hanno i dettagli specifici della creazione di pacchetti e della distribuzione lasciati alle preferenze dello sviluppatore. Probabilmente, la soluzione più comune consiste nel generare un pacchetto unitypackage e distribuirlo tramite Unity Asset Store.

Se un provider di dati viene inviato e accettato come parte del pacchetto microsoft Realtà mista Toolkit, il team microsoft MRTK creerà un pacchetto e lo distribuirà come parte delle offerte MRTK.

Vedi anche