Controller di movimento in Unity

Esistono due modi principali per intraprendere azioni sullo sguardo in Unity, i movimenti delle mani e i controller di movimento in HoloLens e HMD immersivi. Si accede ai dati per entrambe le origini di input spaziale tramite le stesse API in Unity.

Unity offre due modi principali per accedere ai dati di input spaziali per Windows Mixed Reality. Le API comuni Input.GetButton/Input.GetAxis funzionano in più SDK di Unity XR, mentre l'API InteractionManager/GestureRecognizer specifica per Windows Mixed Reality espone il set completo di dati di input spaziali.

API di input di Unity XR

Per i nuovi progetti, è consigliabile usare le nuove API di input XR dall'inizio.

Altre informazioni sulle API XR sono disponibili qui.

Tabella di mapping del pulsante/asse unity

Gestione input di Unity per Windows Mixed Reality controller di movimento supporta gli ID del pulsante e dell'asse elencati di seguito tramite le API Input.GetButton/GetAxis. La colonna "Windows MR-specific" fa riferimento alle proprietà disponibili fuori dal tipo InteractionSourceState . Ognuna di queste API è descritta in dettaglio nelle sezioni seguenti.

I mapping ID asse/pulsante per Windows Mixed Reality in genere corrispondono agli ID del pulsante/asse Oculus.

I mapping ID asse/pulsante per Windows Mixed Reality differiscono dai mapping di OpenVR in due modi:

  1. Il mapping usa ID touchpad distinti da un'tastiera, per supportare i controller con le levette e i touchpad.
  2. Il mapping evita l'overload degli ID pulsante A e X per i pulsanti Menu per lasciarli disponibili per i pulsanti ABXY fisici.
InputAPI Unity comuni
(Input.GetButton/GetAxis)
API di input specifica di MR di Windows
(XR. WSA. Input)
Mano sinistra Mano destra
Selezionare trigger premuto Asse 9 = 1,0 Asse 10 = 1,0 selectPressed
Selezionare il valore analogico del trigger Asse 9 Asse 10 selectPressedAmount
Selezionare il trigger parzialmente premuto Pulsante 14 (compat del gamepad) Pulsante 15 (compat del gamepad) selectPressedAmount > 0.0
Pulsante menu premuto Pulsante 6* Pulsante 7* menuPressed
Pulsante di presa premuto Asse 11 = 1.0 (nessun valore analogico)
Pulsante 4 (compat del gamepad)
Asse 12 = 1.0 (nessun valore analogico)
Pulsante 5 (compat del gamepad)
Afferrato
Pollice X (a sinistra: -1.0, destra: 1.0) Asse 1 Asse 4 thumbstickPosition.x
Y (superiore: -1.0, inferiore: 1.0) Asse 2 Asse 5 thumbstickPosition.y
Pollice premuto Pulsante 8 Pulsante 9 thumbstickPressed
Touchpad X (a sinistra: -1.0, destra: 1.0) Asse 17* Asse 19* touchpadPosition.x
Touchpad Y (superiore: -1.0, inferiore: 1.0) Asse 18* Asse 20* touchpadPosition.y
Touchpad toccato Pulsante 18* Pulsante 19* touchpadTouched
Touchpad premuto Pulsante 16* Pulsante 17* touchpadPressed
Posizione della presa 6DoF o posizione puntatore Sola posa del grip: XR. InputTracking.GetLocalPosition
XR. InputTracking.GetLocalRotation
Passare grip o puntatore come argomento: sourceState.sourcePose.TryGetPosition
sourceState.sourcePose.TryGetRotation
Stato di rilevamento Precisione della posizione e rischio di perdita di origine disponibili solo tramite API specifiche di MR sourceState.sourcePose.positionAccuracy
sourceState.properties.sourceLossRisk

Nota

Questi ID pulsante/asse differiscono dagli ID usati da Unity per OpenVR a causa di collisioni nei mapping usati da gamepad, Oculus Touch e OpenVR.

OpenXR

Per informazioni sulle nozioni di base sulle interazioni di realtà mista in Unity, visitare Unity Manual for Unity XR Input. Questa documentazione di Unity illustra i mapping da input specifici del controller a input più generalizzabili Di InputFeatureUsages, sul modo in cui gli input XR disponibili possono essere identificati e classificati, come leggere i dati da questi input e altro ancora.

Il plug-in OpenXR Realtà mista fornisce profili di interazione di input aggiuntivi, mappati a InputFeatureUsagestandard come illustrato di seguito:

InputFeatureUsage Controller HP Reverb G2 (OpenXR) Mano HoloLens (OpenXR)
primary2DAxis Joystick
primary2DAxisClick Joystick - Fare clic su
trigger Trigger
Presa Presa Tocco o compressione dell'aria
primaryButton [X/A] - Premere Simulazione del tocco
secondaryButton [Y/B] - Premere
gripButton Grip - Premere
triggerButton Trigger - Premere
menuButton Menu

Posizione di presa e posa puntante

Windows Mixed Reality supporta i controller di movimento in un'ampia gamma di fattori di forma. La progettazione di ogni controller differisce nella relazione tra la posizione della mano dell'utente e la direzione "avanti" naturale che le app devono usare per puntare quando si esegue il rendering del controller.

Per rappresentare meglio questi controller, esistono due tipi di pose che è possibile analizzare per ogni origine di interazione, la posizione del puntatore e la posizione del puntatore. Entrambe le coordinate della posizione del puntatore e della posizione del puntatore sono espresse da tutte le API unity nelle coordinate globali di Unity.

Posizione di presa

La posizione della presa rappresenta la posizione del palmo degli utenti, rilevata da un holoLens o tenendo premuto un controller di movimento.

Nei visori vr vr immersivi, la posizione di presa viene usata al meglio per eseguire il rendering della mano dell'utente o di un oggetto tenuto nella mano dell'utente. La posa della presa viene usata anche quando si visualizza un controller di movimento. Il modello di rendering fornito da Windows per un controller di movimento usa la posizione di presa come origine e centro di rotazione.

La posa della presa è definita in modo specifico come indicato di seguito:

  • Posizione di presa: il centro del palmo quando si tiene il controller naturalmente, regolato a sinistra o destra al centro della posizione all'interno della presa. Sul controller di movimento Windows Mixed Reality, questa posizione è in genere allineata al pulsante Grasp.
  • Asse destro dell'orientamento della presa: quando si apre completamente la mano per formare una posa a 5 dita piatta, il raggio normale al palmo (avanti dal palmo sinistro, indietro dal palmo destro)
  • Asse avanti dell'orientamento della presa: quando si chiude parzialmente la mano (come se si tiene il controller), il raggio che punta "avanti" attraverso il tubo formato dalle dita non di pollice.
  • Asse Up dell'orientamento del grip: asse Up implicito dalle definizioni Destra e Avanti.

È possibile accedere alla posa del grip tramite l'API di input tra fornitori di Unity (XR). InputTracking. GetLocalPosition/Rotation) o tramite l'API specifica di Mr di Windows (sourceState.sourcePose.TryGetPosition/Rotation, richiesta di dati di posa per il nodo Grip ).

Posizione puntatore

La posizione del puntatore rappresenta la punta del controller che punta avanti.

La posizione del puntatore fornito dal sistema è preferibile usare per raycast quando si esegue il rendering del modello controller stesso. Se si esegue il rendering di un altro oggetto virtuale al posto del controller, ad esempio una pistola virtuale, è consigliabile puntare con un raggio più naturale per tale oggetto virtuale, ad esempio un raggio che viaggia lungo la canna del modello di pistola definito dall'app. Poiché gli utenti possono visualizzare l'oggetto virtuale e non il controller fisico, puntando con l'oggetto virtuale probabilmente sarà più naturale per quelli che usano l'app.

Attualmente, la posizione del puntatore è disponibile in Unity solo tramite l'API specifica di Windows MR, sourceState.sourcePose.TryGetPosition/Rotation, passando in InteractionSourceNode.Pointer come argomento.

OpenXR

È possibile accedere a due set di pose tramite interazioni di input OpenXR:

  • La presa si pone per il rendering di oggetti nella mano
  • L'obiettivo è quello di puntare al mondo.

Altre informazioni su questa progettazione e le differenze tra le due posizioni sono disponibili nelle specifiche OpenXR - Sottopath di input.

Le posizioni fornite dall'oggetto InputFeatureUsages DevicePosition, DeviceRotation, DeviceVelocity e DeviceAngularVelocity rappresentano la posizione del grip OpenXR. InputFeatureUsages correlato alle pose di grip sono definiti in CommonUsages di Unity.

Pose fornite da InputFeatureUsages PointerPosition, PointerRotation, PointerVelocity e PointerAngularVelocity rappresentano la posizione dell'obiettivo OpenXR. Questi inputFeatureUsages non sono definiti in file C# inclusi, pertanto è necessario definire i propri InputFeatureUsages come indicato di seguito:

public static readonly InputFeatureUsage<Vector3> PointerPosition = new InputFeatureUsage<Vector3>("PointerPosition");

Aptici

Per informazioni sull'uso di aptici nel sistema di input XR di Unity, è possibile trovare la documentazione nell'input Unity Manual for Unity XR - Haptics.

Stato di rilevamento del controller

Come le cuffie, il controller di movimento Windows Mixed Reality non richiede alcuna configurazione di sensori di rilevamento esterni. I controller vengono invece rilevati dai sensori nel visore stesso.

Se l'utente sposta i controller fuori dal campo di visualizzazione del visore, Windows continua a dedurre le posizioni del controller nella maggior parte dei casi. Quando il controller ha perso il rilevamento visivo per un numero sufficiente di tempo, le posizioni del controller scenderanno a posizioni approssimative di accuratezza.

A questo punto, il sistema blocca il controller all'utente, rilevando la posizione dell'utente mentre si spostano, mentre espone ancora l'orientamento vero del controller usando i sensori di orientamento interno. Molte app che usano controller per puntare e attivare gli elementi dell'interfaccia utente possono funzionare normalmente mentre in accuratezza approssimativa senza che l'utente noti.

Motivo dello stato di rilevamento in modo esplicito

Le app che desiderano trattare le posizioni in modo diverso in base allo stato di rilevamento possono continuare e controllare le proprietà sullo stato del controller, ad esempio SourceLossRisk e PositionAccuracy:

Stato di rilevamento SourceLossRisk PositionAccuracy TryGetPosition
Accuratezza elevata < 1.0 Alto true
Accuratezza elevata (a rischio di perdita) == 1.0 Alto true
Accuratezza approssimativa == 1.0 Con approssimazione true
Nessuna posizione == 1.0 Con approssimazione false

Questi stati di rilevamento del controller di movimento sono definiti come segue:

  • Accuratezza elevata: Mentre il controller di movimento si trova all'interno del campo della visualizzazione del visore, in genere fornisce posizioni ad alta accuratezza, in base al rilevamento visivo. Un controller in movimento che lascia momentaneamente il campo della vista o è momentaneamente offuscato dai sensori visori (ad esempio dall'altra parte dell'utente) continuerà a restituire posizioni ad alta accuratezza per un breve periodo di tempo, in base al rilevamento inertiale del controller stesso.
  • Accuratezza elevata (a rischio di perdita): Quando l'utente sposta il controller di movimento oltre il bordo del campo di visualizzazione del visore, il visore sarà presto in grado di tenere traccia visivamente della posizione del controller. L'app sa quando il controller ha raggiunto questo limite FOV visualizzando sourceLossRisk raggiunge la versione 1.0. A questo punto, l'app può scegliere di sospendere i movimenti del controller che richiedono un flusso costante di pose di alta qualità.
  • Accuratezza approssimativa: Quando il controller ha perso il rilevamento visivo per un numero sufficiente di tempo, le posizioni del controller scenderanno a posizioni approssimative di accuratezza. A questo punto, il sistema blocca il controller all'utente, rilevando la posizione dell'utente mentre si spostano, mentre espone ancora l'orientamento vero del controller usando i sensori di orientamento interno. Molte app che usano controller per puntare e attivare gli elementi dell'interfaccia utente possono funzionare come normali mentre in accuratezza approssimativa senza che l'utente noti. Le app con requisiti di input più pesanti possono scegliere di intuire questa eliminazione dall'accuratezza elevata all'accuratezza approssimativa controllando la proprietà PositionAccuracy , ad esempio per dare all'utente un hitbox più generoso sulle destinazioni fuori schermo durante questo periodo.
  • Nessuna posizione: Anche se il controller può operare con accuratezza approssimativa per molto tempo, a volte il sistema sa che anche una posizione bloccata dal corpo non è significativa al momento. Ad esempio, un controller attivato potrebbe non essere mai stato osservato visivamente o un utente potrebbe mettere in giù un controller che viene quindi raccolto da un altro utente. A quel punto, il sistema non fornirà alcuna posizione all'app e TryGetPosition restituirà false.

API Di Unity comuni (Input.GetButton/GetAxis)

Spazio dei nomi:UnityEngine, UnityEngine.XR
Tipi: Input, XR. InputTracking

Unity usa attualmente le relative API di Input.GetButton/Input.GetAxis per esporre l'input per Oculus SDK, OpenVR SDK e Windows Mixed Reality, incluse le mani e i controller di movimento. Se l'app usa queste API per l'input, può supportare facilmente i controller di movimento in più SDK XR, tra cui Windows Mixed Reality.

Recupero dello stato premuto di un pulsante logico

Per usare le API di input di Unity generali, in genere si inizierà tramite il collegamento di pulsanti e assi a nomi logici in Unity Input Manager, associazione di id asse o pulsante a ogni nome. È quindi possibile scrivere codice che fa riferimento al nome del pulsante/asse logico.

Ad esempio, per eseguire il mapping del pulsante trigger del controller di movimento sinistro all'azione Invia, passare a Modifica > input impostazioni > progetto in Unity e espandere le proprietà della sezione Invia in Assi. Modificare la proprietà Pulsante positivo o Alt Pulsante positivo per leggere il pulsante del joystick 14, come indicato di seguito:

InputManager di Unity
Unity InputManager

Lo script può quindi verificare la presenza dell'azione Invia usando Input.GetButton:

if (Input.GetButton("Submit"))
{
  // ...
}

È possibile aggiungere più pulsanti logici modificando la proprietà Size in Assi.

Ottenere direttamente lo stato premuto di un pulsante fisico

È anche possibile accedere manualmente ai pulsanti con il nome completo usando Input.GetKey:

if (Input.GetKey("joystick button 8"))
{
  // ...
}

Posa di una mano o di un controller di movimento

È possibile accedere alla posizione e alla rotazione del controller usando XR. InputTracking:

Vector3 leftPosition = InputTracking.GetLocalPosition(XRNode.LeftHand);
Quaternion leftRotation = InputTracking.GetLocalRotation(XRNode.LeftHand);

Nota

Il codice precedente rappresenta la posizione di presa del controller (dove l'utente contiene il controller), che è utile per eseguire il rendering di una spada o una pistola nella mano dell'utente o un modello del controller stesso.

La relazione tra questa posizione di presa e la posizione del puntatore (dove la punta del controller sta puntando) può essere diversa tra i controller. In questo momento, l'accesso alla posizione del puntatore del controller è possibile solo tramite l'API di input specifica di MR, descritta nelle sezioni seguenti.

API specifiche di Windows (XR). WSA. Input)

Attenzione

Se il progetto usa una delle funzionalità XR. Le API WSA, queste vengono gradualmente eliminate a favore dell'SDK XR nelle versioni future di Unity. Per i nuovi progetti, è consigliabile usare XR SDK dall'inizio. Qui sono disponibili altre informazioni sul sistema di input XR e sulle API.

Spazio dei nomi:UnityEngine.XR.WSA.Input
Tipi: InteractionManager, InteractionSourceState, InteractionSource, InteractionSourceProperties, InteractionSourceKind, InteractionSourceLocation

Per ottenere informazioni più dettagliate sull'input a mano Windows Mixed Reality (per HoloLens) e sui controller di movimento, è possibile scegliere di usare le API di input spaziali specifiche di Windows nello spazio dei nomi UnityEngine.XR.WSA.Input. In questo modo è possibile accedere a informazioni aggiuntive, ad esempio l'accuratezza della posizione o il tipo di origine, consentendo di indicare le mani e i controller a parte.

Polling per lo stato delle mani e dei controller di movimento

È possibile eseguire il polling dello stato di questo frame per ogni origine di interazione (mano o controller di movimento) usando il metodo GetCurrentReading .

var interactionSourceStates = InteractionManager.GetCurrentReading();
foreach (var interactionSourceState in interactionSourceStates) {
    // ...
}

Ogni InteractionSourceState viene restituita rappresenta un'origine di interazione al momento corrente. InteractionSourceState espone informazioni come:

  • Quali tipi di presse si verificano (Selezionare/Menu/Grasp/Touchpad/Thumbstick)

    if (interactionSourceState.selectPressed) {
         // ...
    }
    
  • Altri dati specifici dei controller di movimento, ad esempio le coordinate XY del touchpad e/o del pollice e lo stato toccato

    if (interactionSourceState.touchpadTouched && interactionSourceState.touchpadPosition.x > 0.5) {
         // ...
    }
    
  • InteractionSourceKind per sapere se l'origine è una mano o un controller di movimento

    if (interactionSourceState.source.kind == InteractionSourceKind.Hand) {
         // ...
    }
    

Polling per i rendering stimati in avanti

  • Quando si esegue il polling per i dati dell'origine di interazione da mani e controller, le pose che si ottengono sono pose in avanti per il momento in cui i fotoni di questa cornice raggiungeranno gli occhi dell'utente. Le posizioni stimate in avanti sono più adatte per il rendering del controller o di un oggetto tenuto ogni fotogramma. Se si punta a una determinata stampa o rilascio con il controller, questo sarà più accurato se si usano le API degli eventi cronologici descritte di seguito.

    var sourcePose = interactionSourceState.sourcePose;
    Vector3 sourceGripPosition;
    Quaternion sourceGripRotation;
    if ((sourcePose.TryGetPosition(out sourceGripPosition, InteractionSourceNode.Grip)) &&
         (sourcePose.TryGetRotation(out sourceGripRotation, InteractionSourceNode.Grip))) {
         // ...
    }
    
  • È anche possibile ottenere la posizione head stimata in avanti per questo frame corrente. Come per la posizione di origine, questo è utile per il rendering di un cursore, anche se la destinazione di una determinata stampa o rilascio sarà più accurata se si usano le API dell'evento cronologico descritte di seguito.

    var headPose = interactionSourceState.headPose;
    var headRay = new Ray(headPose.position, headPose.forward);
    RaycastHit raycastHit;
    if (Physics.Raycast(headPose.position, headPose.forward, out raycastHit, 10)) {
         var cursorPos = raycastHit.point;
         // ...
    }
    

Gestione degli eventi di origine dell'interazione

Per gestire gli eventi di input quando si verificano con i dati cronologici accurati, è possibile gestire gli eventi di origine di interazione anziché eseguire il polling.

Per gestire gli eventi dell'origine di interazione:

  • Registrare un evento di input InteractionManager . Per ogni tipo di evento di interazione a cui si è interessati, è necessario sottoscrivere l'evento.

    InteractionManager.InteractionSourcePressed += InteractionManager_InteractionSourcePressed;
    
  • Gestire l'evento. Dopo aver effettuato la sottoscrizione a un evento di interazione, il callback verrà visualizzato quando appropriato. Nell'esempio SourcePressed , questa operazione verrà eseguita dopo che l'origine è stata rilevata e prima che venga rilasciata o persa.

    void InteractionManager_InteractionSourceDetected(InteractionSourceDetectedEventArgs args)
         var interactionSourceState = args.state;
    
         // args.state has information about:
            // targeting head ray at the time when the event was triggered
            // whether the source is pressed or not
            // properties like position, velocity, source loss risk
            // source id (which hand id for example) and source kind like hand, voice, controller or other
    }
    

Come interrompere la gestione di un evento

È necessario interrompere la gestione di un evento quando non si è più interessati all'evento o si sta distruggendo l'oggetto che ha sottoscritto l'evento. Per interrompere la gestione dell'evento, annullare la sottoscrizione dall'evento.

InteractionManager.InteractionSourcePressed -= InteractionManager_InteractionSourcePressed;

Elenco degli eventi di origine dell'interazione

Gli eventi di origine di interazione disponibili sono:

  • InteractionSourceDetected (origine diventa attiva)
  • InteractionSourceLost (diventa inattivo)
  • InteractionSourcePressed (toccare, premere il pulsante o "Seleziona" espressione)
  • InteractionSourceReleased (fine di un tocco, un pulsante rilasciato o la fine di "Select" espressione)
  • InteractionSourceUpdated (sposta o modifica uno stato)

Gli eventi per la destinazione cronologica pongono che corrispondono in modo più accurato a una stampa o a un rilascio

Le API di polling descritte in precedenza forniscono alle app le posizioni stimate in avanti. Anche se queste posizioni stimate sono migliori per il rendering del controller o di un oggetto portatile virtuale, le pose future non sono ottimali per la destinazione, per due motivi principali:

  • Quando l'utente preme un pulsante su un controller, può esserci circa 20 ms di latenza wireless tramite Bluetooth prima che il sistema riceva la pressione.
  • Quindi, se si usa una posa stimata in avanti, ci sarebbe un altro 10-20 ms di stima inoltrata applicato al momento in cui i fotoni della cornice corrente raggiungeranno gli occhi dell'utente.

Ciò significa che il polling fornisce una posizione o una posizione head di origine che è di 30-40 ms avanti da dove la testa e le mani dell'utente sono effettivamente tornate quando la stampa o il rilascio è successo. Per l'input della mano di HoloLens, mentre non è presente alcun ritardo di trasmissione wireless, c'è un ritardo di elaborazione simile per rilevare la pressione.

Per eseguire con precisione la destinazione in base alla finalità originale dell'utente per una mano o un controller, è consigliabile usare la posizione cronologica dell'origine o della testa dall'evento di input InteractionSourcePressed o InteractionSourceReleased .

È possibile indirizzare una stampa o un rilascio con dati cronologici di posa dalla testa dell'utente o dal relativo controller:

  • La testa si trova al momento in cui si è verificato un movimento o un controller, che può essere usato per la destinazione per determinare qual è stato lo sguardo dell'utente:

    void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs args) {
         var interactionSourceState = args.state;
         var headPose = interactionSourceState.headPose;
         RaycastHit raycastHit;
         if (Physics.Raycast(headPose.position, headPose.forward, out raycastHit, 10)) {
             var targetObject = raycastHit.collider.gameObject;
             // ...
         }
    }
    
  • L'origine rappresenta al momento in cui si è verificata una pressione del controller di movimento, che può essere usata per la destinazione per determinare qual è stato il punto in cui l'utente puntava il controller. Questo sarà lo stato del controller che ha riscontrato la stampa. Se si esegue il rendering del controller stesso, è possibile richiedere la posizione del puntatore anziché la posa della presa, per sparare il raggio di destinazione da ciò che l'utente considererà la punta naturale del controller di cui è stato eseguito il rendering:

    void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs args)
    {
         var interactionSourceState = args.state;
         var sourcePose = interactionSourceState.sourcePose;
         Vector3 sourceGripPosition;
         Quaternion sourceGripRotation;
         if ((sourcePose.TryGetPosition(out sourceGripPosition, InteractionSourceNode.Pointer)) &&
             (sourcePose.TryGetRotation(out sourceGripRotation, InteractionSourceNode.Pointer))) {
             RaycastHit raycastHit;
             if (Physics.Raycast(sourceGripPosition, sourceGripRotation * Vector3.forward, out raycastHit, 10)) {
                 var targetObject = raycastHit.collider.gameObject;
                 // ...
             }
         }
    }
    

Esempio di gestori eventi

using UnityEngine.XR.WSA.Input;

void Start()
{
    InteractionManager.InteractionSourceDetected += InteractionManager_InteractionSourceDetected;
    InteractionManager.InteractionSourceLost += InteractionManager_InteractionSourceLost;
    InteractionManager.InteractionSourcePressed += InteractionManager_InteractionSourcePressed;
    InteractionManager.InteractionSourceReleased += InteractionManager_InteractionSourceReleased;
    InteractionManager.InteractionSourceUpdated += InteractionManager_InteractionSourceUpdated;
}

void OnDestroy()
{
    InteractionManager.InteractionSourceDetected -= InteractionManager_InteractionSourceDetected;
    InteractionManager.InteractionSourceLost -= InteractionManager_InteractionSourceLost;
    InteractionManager.InteractionSourcePressed -= InteractionManager_InteractionSourcePressed;
    InteractionManager.InteractionSourceReleased -= InteractionManager_InteractionSourceReleased;
    InteractionManager.InteractionSourceUpdated -= InteractionManager_InteractionSourceUpdated;
}

void InteractionManager_InteractionSourceDetected(InteractionSourceDetectedEventArgs args)
{
    // Source was detected
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourceLost(InteractionSourceLostEventArgs state)
{
    // Source was lost. This will be after a SourceDetected event and no other events for this
    // source id will occur until it is Detected again
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs state)
{
    // Source was pressed. This will be after the source was detected and before it is
    // released or lost
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourceReleased(InteractionSourceReleasedEventArgs state)
{
    // Source was released. The source would have been detected and pressed before this point.
    // This event will not fire if the source is lost
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourceUpdated(InteractionSourceUpdatedEventArgs state)
{
    // Source was updated. The source would have been detected before this point
    // args.state has the current state of the source including id, position, kind, etc.
}

Controller di movimento in MRTK

È possibile accedere al controller di movimento e al controller di movimento da Gestione input.

Seguire le esercitazioni

Le esercitazioni dettagliate, con esempi di personalizzazione più dettagliati, sono disponibili nella Realtà mista Academy:

Input MR 213 - Controller di movimento
Input MR 213 - Controller di movimento

Successivo checkpoint di sviluppo

Se si sta seguendo il percorso di sviluppo di Unity, si è in corso l'esplorazione dei blocchi predefiniti di MRTK. Da qui è possibile passare al blocco predefinito successivo:

In alternativa, passare alle API e funzionalità della piattaforma di realtà mista:

È sempre possibile tornare ai checkpoint per lo sviluppo con Unity in qualsiasi momento.

Vedere anche