Interazioni - MRTK3

MRTK si basa sull'oggetto XRBaseInteractable fornito dal Toolkit di interazione XR di Unity. Il comportamento e l'API interagibili esistenti sono completamente supportati in MRTK e tutti gli utenti personalizzati interagiscono con l'API XRI interagendo esistente.

Per gli sviluppatori che non hanno esperienza con XRI, è consigliabile consultare prima la documentazione dell'architettura XRI di Unity.

Per espandersi sui meccanismi intergiungibili inclusi in XRI, MRTK offre due classi di base su cui è possibile creare interazioni avanzate, una che estende l'altra.

Interactables inheritance diagram

  • MRTKBaseInteractable : XRBaseInteractable
    • Questa classe offre filtri e contrassegni per diversi tipi di interactor. Anche se l'XRI XRBaseInteractable di base non discrimina tra i tipi di interazione, MRTKBaseInteractable fornisce funzioni utili per verificare se si verificano tipi comuni di interazioni. Le proprietà utili, ad esempio IsGazeHovered o IsGrabSelected , sono collegamenti per l'esecuzione di query sul fatto che un interaginte partecipante implementi una determinata interfaccia (corrispondentemente IGazeInteractor o IGrabInteractor). Questi flag sono più efficienti rispetto all'iterazione dell'elenco di interactorsHovering o interactorsSelecting. Inoltre, MRTKBaseInteractable può filtrare/rifiutare determinati tipi di interagitori nel caso in cui lo sviluppatore desideri escludere determinate modalità di input.
  • StatefulInteractable : MRTKBaseInteractable
    • Mentre MRTKBaseInteractable aggiunge flag e filtri ed evita l'aggiunta di qualsiasi stato aggiuntivo all'interazione, StatefulInteractable introduce funzionalità utili come l'attivazione/disattivazione e la selezione di variabili.

Separazione rigorosa di stato e oggetti visivi

In MRTK 2.x, le interazioni sono spesso responsabili della guida dei propri effetti visivi, sia la compressione di un pulsante 3D, un effetto al passaggio del mouse o anche solo la modifica del colore su un clic. La limitazione di questo approccio è che la logica di interazione è strettamente associata agli oggetti visivi. Se si desidera riprogettare gli oggetti visivi o usare una dimensione/forma/spostamento/etc diversa del pulsante, lo script di interazione stesso dovrà cambiare.

In MRTK3 , gli elementi interagendo sono puro stato e interazione. L'oggetto interagendo non esegue il rendering di modifiche o effetti visivi in base allo stato interno. È puramente una raccolta di logica di stato e interazione altamente portabile tra le configurazioni della presentazione visiva.

Strict isolation of state and visuals

Lo stesso PressableButton script può essere usato per creare una palla ondulata, un piano "trackpad" pressabile o un piano astratto che emette eventi di rete su pressa. Lo PressableButton script non interessa neanche "dove" è, potrebbe trovarsi all'interno di un canvas o su un rigido.

Per guidare gli oggetti visivi, viene usato un "driver visivo" separato per eseguire il polling dello stato dall'oggetto interagendo ed eseguire il rendering del feedback appropriato. StateVisualizer è il metodo consigliato a basso codice per guidare gli effetti comuni di feedback visivo dallo stato interagendo, ma gli sviluppatori sono liberi di scrivere i propri driver visivi personalizzati. Ad esempio, i componenti dei pulsanti usano StateVisualizer in genere per i relativi effetti di feedback avanzati basati su 3D + shader, ma viene fornito anche un esempio BasicPressableButtonVisuals che mostra come è possibile creare un driver visivo semplice nel codice.

selezione di variabili

StatefulInteractableLa funzionalità aggiuntiva più utile per la funzionalità XRI di base è il supporto per la variabile Selectedness. Anche se le interazioni XRI di base sono selezionate o meno, mrTK StatefulInteractablepuò essere qualsiasi frazione a virgola mobile di selezionata.

Questo concetto è utile quando si lavora in XR, poiché quasi tutte le forme di input non sono più stati binari. I controller di movimento hanno spesso trigger analogici (o grip analogici!), le interazioni con la mano possono fornire una variabile "avvicinamento delle dita" e le interazioni di pressionemetrica possono deprimere un pulsante o una superficie pushable di una quantità variabile. Queste interazioni analogiche vengono visualizzate ovunque in XR e MRTK è dotato di supporto per aiutare gli sviluppatori a creare interazioni piacevoli su questi input analogici.

Un'ampia gamma di diversi interagitori e tipi di interazioni può tutti contribuire insieme alla selezione complessiva di un oggetto interagendo. In particolare, tutti gli interagitori che implementano IVariableSelectInteractor contribuiscono alla loro quantità di selezione analogica, in genere attraverso un max() di tutti gli interagendotori partecipanti. Questa quantità variabile viene combinata con le selezioni binarie non variabili provenienti da interagendotori di tipo vaniglia.

Per le classi derivate come PressableButton, la Selectedness() funzione viene sottoposta a override per aggiungere un altro "ingrediente" al calcolo della selezione. Gli interagitori che implementano IPokeInteractor possono contribuire alla selezione in base alla posizione fisica e al modo in cui sono fisicamente premuti sull'interagendo. Altre classi derivate possono introdurre altre forme arbitrarie di selezione.

Variable selectedness

Per le funzionalità di mrTK interagendo e Selectedness()isSelected accetta sempre ,in altre parole, non si noterà mai un valore maggiore di SelectThreshold senza un Selectedness() XRI isSelected corrispondente e un interaginte associato in interactorsSelecting.

Importante

Le sottoclassi con interazione personalizzata possono ovviamente eseguire l'override di un altro valore completamente Selectedness disconnesso dall'XRI isSelected. Tuttavia, le interazioni non vengono eseguite e è fortemente sconsigliato. In generale, non scrivere mai interazioni che non hanno un interactor corrispondente. La selezione XRI, nella maggior parte dei casi, sarà sufficiente e tutte le interazioni personalizzate create devono essere scritte come interagiscitori.

Quando si crea un'interazione personalizzata che supporta un nuovo metodo per determinare Selectedness(), è sufficiente eseguire l'override del metodo e combinare la nuova selezione con la quantità di selezione esistente. Se si usa StateVisualizer o qualsiasi altro livello visivo in ascolto della selezione di variabili, risponderà di conseguenza al nuovo tipo di selezione.

Eseguire il mapping degli eventi UGUI a XRI

In alcuni casi, è consigliabile avere interazioni con gli eventi UGUI, ad esempio mouse, game pad o input touchscreen. L'oggetto UGUIInputAdapter, che è un UGUI Selectable, riceve gli eventi UGUI e li inoltra a un CanvasProxyInteractoroggetto , se presente.

UGUI adapter flow

Quando l'oggetto CanvasProxyInteractor riceve una notifica degli eventi UGUI da UGUIInputAdapter, rilascia azioni XRI equivalenti per l'interazione pertinente. Il mapping tra l'input UGUI e le azioni XRI è leggermente perso ed è un'area di sviluppo attivo.

Con questo sistema, gli XRI esistenti interagiscono per piattaforme immersive, mani, controller del movimento e input 3D possono reagire altrettanto bene ai controlli 2D accessibili, ad esempio mouse e game pad.