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 del dispositivo 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 manager dei dispositivi, per il sistema di input. Il codice di esempio illustrato di seguito proviene da WindowsMixedRealityDeviceManager.

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

Struttura dello spazio dei nomi e delle cartelle

I provider di dati possono essere distribuiti come componente aggiuntivo di terze parti o come parte di Microsoft Realtà mista Toolkit. Il processo di approvazione per l'invio di nuovi provider di dati a MRTK varia in base al 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 deve 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 collisioni 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 dall'azienda Contoso può essere "Contoso.MixedReality.Toolkit.Input".

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

Esempio di struttura di cartelle

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 di controller comuni sono disponibili nella cartella MixedRealityToolkit\StandardAssets\Textures.

Implementare il provider di dati

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

Tutti i provider di dati di sistema di input devono implementare l'interfaccia IMixedRealityInputDeviceManager , che specifica la funzionalità minima richiesta dal sistema di input. La fondazione MRTK include la BaseInputDeviceManager classe che fornisce un'implementazione predefinita di questa funzionalità richiesta. 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 dall'oggetto WindowsMixedRealityDeviceManager per indicare che fornisce supporto per un set di funzionalità di input, in particolare, mani articolate, mani di movimento 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 consente di impostare il profilo predefinito e le piattaforme per il provider, quando selezionato 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 responsabili dei dispositivi supportano 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 distribuita (ad esempio: sinistra o destra) e un'immagine del 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 interazioni 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 corretti dell'asse e dei pulsanti da assegnare alle interazioni.

L'esempio GenericOpenVRController seguente è abbreviato dalla classe, disponibile 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 di Unity e le definizioni dei pulsanti.

Generare eventi di notifica

Per consentire alle applicazioni di rispondere all'input dall'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: posizione touchpad) deve essere generato l'evento InputChanged.

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

Aggiungere la strumentazione di Unity Profiler

Le prestazioni sono critiche nelle applicazioni di realtà mista. Ogni componente aggiunge un sovraccarico per cui le applicazioni devono tenere conto. A questo scopo, è importante che tutti i provider di dati di input contengano strumentazione Unity Profiler nel ciclo interno e che spesso vengano usati percorsi di codice.

È 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 utilizzato per identificare il marcatore del profiler è arbitrario. MRTK usa il modello seguente.

"[product] className.methodName - nota facoltativa"

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

Creare il profilo e il controllo

In 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 eseguire il mirroring delle 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 profilo per consentire ai clienti di creare un'istanza del profilo usando il menu Crea > asset > Realtà mista Toolkit > Profiles.

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 informa Unity il tipo di asset a cui si applica il controllo.

Creare definizioni di assembly

Realtà mista Toolkit usa i file di definizione dell'assembly (con estensione asmdef) per specificare le dipendenze tra i componenti e per aiutare Unity a ridurre il 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, esistono due file 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 a seconda del quale 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 trova 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.

Provider di dati del sistema di input registrati

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