Creazione di un provider di dati del sistema di input

Il sistema di input mixed reality toolkit è un sistema estendibile per l'abilitazione del 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 è da WindowsMixedRealityDeviceManager .

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

Spazio dei nomi e struttura di cartelle

I provider di dati possono essere distribuiti come componenti aggiuntivi di terze parti o come parte di Microsoft Mixed Reality Toolkit. Il processo di approvazione per l'invio di nuovi provider di dati a MRTK varia caso per caso e verrà comunicato al momento della proposta iniziale.

Importante

Se un provider di dati del sistema di input viene inviato al repository mixed reality 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 ridurre i 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 dall'azienda Contoso può essere "Contoso.MixedReality.Toolkit.Input".

È consigliabile che il codice sorgente per i provider di dati sia disponibile 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 le immagini dei controller supportati e Profiles contiene uno o più profili predefiniti.

Nota

Alcune immagini comuni del controller 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 del sistema di input devono implementare l'interfaccia , che IMixedRealityInputDeviceManager specifica la funzionalità minima richiesta dal sistema di input. La base di MRTK include BaseInputDeviceManager la 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 forniscono UnityJoystickManager l'implementazione IMixedRealityInputDeviceManager richiesta.

public class WindowsMixedRealityDeviceManager :
    BaseInputDeviceManager,
    IMixedRealityCapabilityCheck
{ }

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

Applicare l'attributo MixedRealityDataProvider

Un passaggio chiave della creazione di un provider di dati di sistema di input consiste nell'applicare MixedRealityDataProvider l'attributo alla classe . Questo passaggio abilita l'impostazione del profilo predefinito e delle piattaforme per il provider, se 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 IMixedRealityDataProvider dell'interfaccia .

Nota

La BaseInputDeviceManager classe , tramite la classe , fornisce solo BaseService implementazioni vuote per i metodi IMixedRealityDataProvider . 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 eventuali controller da supporto.

Implementare le classi controller

L'esempio di WindowsMixedRealityDeviceManager 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 MixedRealityController l'attributo alla classe . Questo attributo specifica il tipo di controller (ad esempio: mano articolata), la mano (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 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 degli assi e dei pulsanti corretti da assegnare alle interazioni.

L'esempio seguente è abbreviato dalla classe GenericOpenVRController , 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 le definizioni di asse di input e pulsante di 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 IMixedRealityInputHandler<T> interfacce e .

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 analoghi ,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 aggiunge una certa quantità di overhead per cui le applicazioni devono essere gestite. 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

In Mixed Reality 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, l'intervallo di aggiornamento). Tutte le proprietà configurabili dall'utente definite in ogni interfaccia devono essere contenute nel profilo.

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

L'attributo può essere applicato alla classe del profilo per consentire ai clienti di creare un'istanza del profilo usando il menu Create > Assets > Mixed Reality Toolkit > Profiles (Crea asset > CreateAssetMenu Mixed Reality 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
{ }

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

Creare definizioni di assembly

Mixed Reality Toolkit usa i file di definizione dell'assembly (con estensioneasmdef)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, saranno presenti due file con estensione asmdef per il provider di dati ContosoInput.

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

La definizione dell'assembly ContosoInputEditor specificherà il controllo 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, nonché:

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

Registrare il provider di dati

Una volta creato, il provider di dati può essere registrato con il sistema di input e 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 dei pacchetti e della distribuzione lasciati alle preferenze dello sviluppatore. È probabile che la soluzione più comune sia generare un file con estensione unitypackage e distribuirsi tramite Unity Asset Store.

Se un provider di dati viene inviato e accettato come parte del pacchetto Microsoft Mixed Reality Toolkit, il team di Microsoft MRTK lo inserirà in un pacchetto e lo distribuirà come parte delle offerte di MRTK.

Vedi anche