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".
Struttura della cartella consigliata
È consigliabile definire il codice sorgente per i provider di dati in una gerarchia di cartelle, come illustrato nell'immagine seguente.
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'oggettoWindowsMixedRealityDeviceManager
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.
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.