Come aggiungere interattività quasi — MRTK2
Le interazioni vicine sono sotto forma di tocchi e afferramenti. Gli eventi touch e grab vengono generati come eventi puntatore rispettivamente da PokePointer e SpherePointer.
Sono necessari tre passaggi chiave per restare in ascolto di eventi di input e/o tocco in un determinato GameObject.
- Verificare che il puntatore pertinente sia registrato nel profilo di configurazione MRTK principale.
- Verificare che il GameObject desiderato disponga del componente di script di tocco o di afferramento appropriato e .
Unity Collider
- Implementare un'interfaccia del gestore di input in uno script collegato al GameObject desiderato per ascoltare gli eventi di cattura o tocco .
Aggiungere interazioni di cattura
Verificare che un oggetto SpherePointer sia registrato nel profilo puntatore MRTK.
Il profilo MRTK predefinito e il profilo HoloLens 2 predefinito contengono già spherePointer. È possibile confermare che un oggetto SpherePointer verrà creato selezionando il profilo di configurazione MRTK e passando aOpzionipuntatore> di input>. Il prefab predefinito
GrabPointer
(Assets/MRTK/SDK/Features/UX/Prefabs/Pointers) deve essere elencato con un tipo di controller di mano articolata. È possibile usare un prefab personalizzato purché implementi laSpherePointer
classe .Il puntatore di afferramento predefinito esegue query per gli oggetti vicini in un cono intorno al punto di afferramento in modo che corrisponda all'interfaccia di HoloLens 2 predefinita.
Nel GameObject che deve essere afferrabile aggiungere un
NearInteractionGrabbable
oggetto , nonché un collisore.Assicurarsi che il livello del GameObject sia su un livello afferrabile. Per impostazione predefinita, tutti i livelli ad eccezione della consapevolezza spaziale e Ignora raycast sono afferrabili. Vedere quali livelli sono afferrabili controllando le maschere di livello afferra nel prefab GrabPointer .
Nel GameObject o in uno dei relativi predecessori aggiungere un componente script che implementa l'interfaccia
IMixedRealityPointerHandler
. Qualsiasi predecessore dell'oggetto conNearInteractionGrabbable
sarà in grado di ricevere anche gli eventi del puntatore.
Esempio di codice Grab
Di seguito è riportato uno script che verrà stampato se un evento è un tocco o un'acquisizione. Nella funzione di interfaccia IMixedRealityPointerHandler pertinente è possibile esaminare il tipo di puntatore che attiva tale evento tramite .MixedRealityPointerEventData
Se il puntatore è un Oggetto SpherePointer, l'interazione è un'acquisizione.
public class PrintPointerEvents : MonoBehaviour, IMixedRealityPointerHandler
{
public void OnPointerDown(MixedRealityPointerEventData eventData)
{
if (eventData.Pointer is SpherePointer)
{
Debug.Log($"Grab start from {eventData.Pointer.PointerName}");
}
if (eventData.Pointer is PokePointer)
{
Debug.Log($"Touch start from {eventData.Pointer.PointerName}");
}
}
public void OnPointerClicked(MixedRealityPointerEventData eventData) {}
public void OnPointerDragged(MixedRealityPointerEventData eventData) {}
public void OnPointerUp(MixedRealityPointerEventData eventData) {}
}
Aggiungere interazioni tramite tocco
Il processo per l'aggiunta di interazioni tramite tocco sugli elementi UnityUI è diverso da quello per gli oggetti GameObject 3D di vaniglia. È possibile passare alla sezione seguente, Interfaccia utente di Unity, per abilitare i componenti dell'interfaccia utente di Unity.
Per entrambi i tipi di elementi dell'esperienza utente, tuttavia, assicurarsi che un PokePointer sia registrato nel profilo puntatore MRTK.
Il profilo MRTK predefinito e il profilo di HoloLens 2 predefinito contengono già un PokePointer. È possibile verificare che venga creato un PokePointer selezionando il profilo di configurazione MRTK e passando aOpzionipuntatore di>input>. Il prefab predefinito PokePointer
(Assets/MRTK/SDK/Features/UX/Prefabs/Pointers) deve essere elencato con un tipo di controller di mano articolata. È possibile usare un prefab personalizzato purché implementi la PokePointer
classe .
GameObject 3D
Esistono due modi diversi per aggiungere interazioni tramite tocco a GameObject 3D, a seconda che l'oggetto 3d abbia un solo piano toccabile o di se deve essere toccabile in base all'intero collisore. Il primo modo è in genere sugli oggetti con BoxColliders, in cui si desidera avere solo un singolo viso del collisore reagire agli eventi di tocco. L'altro è per gli oggetti che devono essere toccabili da qualsiasi direzione in base al loro collisore.
Tocco singolo viso
Ciò è utile per consentire situazioni in cui solo un singolo viso deve essere toccabile. Questa opzione presuppone che l'oggetto gioco abbia un BoxCollider. È possibile usarlo con oggetti non BoxCollider, nel qual caso le proprietà "Bounds" e "Local Center" devono essere impostate manualmente per configurare il piano toccabile( ad esempio, i limiti devono essere impostati su un valore diverso da zero zero).
Nel GameObject che deve essere toccabile aggiungere boxCollider e un
NearInteractionTouchable
componente.Impostare Eventi su Ricevi su Tocco se si usa l'interfaccia
IMixedRealityTouchHandler
nello script del componente seguente.Fare clic su Correggi limiti e centro correzioni
In tale oggetto o in uno dei relativi predecessori aggiungere un componente script che implementa l'oggettoInterfaccia
IMixedRealityTouchHandler
. Qualsiasi predecessore dell'oggetto conNearInteractionTouchable
sarà in grado di ricevere anche gli eventi del puntatore.
Nota
Nella visualizzazione scena dell'editor con l'oggetto GameObject NearInteractionTouchable selezionato si noti un quadrato e una freccia del contorno bianco. La freccia punta alla "parte anteriore" dell'oggetto toccabile. Il collidable sarà toccabile solo da quella direzione. Per rendere un collisore toccabile da tutte le direzioni, vedi la sezione sul tocco arbitrario del collisore.
Tocco di collisore arbitrario
Ciò è utile per consentire situazioni in cui l'oggetto gioco deve essere toccabile lungo l'intero viso collisore. Ad esempio, questo può essere usato per abilitare le interazioni tramite tocco per un oggetto con sphereCollider, in cui l'intero collisore deve essere toccabile.
Nel GameObject che deve essere toccabile aggiungere un collisore e un
NearInteractionTouchableVolume
componente.- Impostare Eventi su Ricevi su Tocco se si usa l'interfaccia
IMixedRealityTouchHandler
nello script del componente seguente.
- Impostare Eventi su Ricevi su Tocco se si usa l'interfaccia
In tale oggetto o in uno dei relativi predecessori aggiungere un componente script che implementa l'oggettoInterfaccia
IMixedRealityTouchHandler
. Qualsiasi predecessore dell'oggetto conNearInteractionTouchable
sarà in grado di ricevere anche gli eventi del puntatore.
Interfaccia utente di Unity
Aggiungere/verificare che nella scena sia presente un'area di disegno UnityUI .
Nel GameObject che deve essere toccabile aggiungere un
NearInteractionTouchableUnityUI
componente.- Impostare Eventi su Ricevi su Tocco se si usa l'interfaccia
IMixedRealityTouchHandler
nello script del componente seguente.
- Impostare Eventi su Ricevi su Tocco se si usa l'interfaccia
In tale oggetto o in uno dei relativi predecessori aggiungere un componente script che implementa l'interfaccia
IMixedRealityTouchHandler
. Qualsiasi predecessore dell'oggetto conNearInteractionTouchableUnityUI
sarà in grado di ricevere anche gli eventi del puntatore.
Importante
Gli oggetti potrebbero non comportarsi come previsto se si trovano su oggetti canvas sovrapposti. Per garantire un comportamento coerente, non sovrapporre mai oggetti canvas nella scena.
Importante
NearInteractionTouchable
Nel componente script, per la proprietà Events to Receive sono disponibili due opzioni: Puntatore e Tocco. Impostare Eventi su Ricevi su Puntatore se si usa l'interfaccia IMixedRealityPointerHandler
e si imposta su Touch se si usa l'interfaccia IMixedRealityTouchHandler
nello script del componente che risponde/gestisce gli eventi di input.
Esempio di codice touch
Il codice seguente illustra un MonoBehaviour che può essere collegato a un GameObject con un NearInteractionTouchable
componente variant e rispondere agli eventi di input tocco.
public class TouchEventsExample : MonoBehaviour, IMixedRealityTouchHandler
{
public void OnTouchStarted(HandTrackingInputEventData eventData)
{
string ptrName = eventData.Pointer.PointerName;
Debug.Log($"Touch started from {ptrName}");
}
public void OnTouchCompleted(HandTrackingInputEventData eventData) {}
public void OnTouchUpdated(HandTrackingInputEventData eventData) { }
}
Esempi di script di interazione vicino
Eventi di tocco
Questo esempio crea un cubo, lo rende toccabile e modifica il colore al tocco.
public static void MakeChangeColorOnTouch(GameObject target)
{
// Add and configure the touchable
var touchable = target.AddComponent<NearInteractionTouchableVolume>();
touchable.EventsToReceive = TouchableEventType.Pointer;
var material = target.GetComponent<Renderer>().material;
// Change color on pointer down and up
var pointerHandler = target.AddComponent<PointerHandler>();
pointerHandler.OnPointerDown.AddListener((e) => material.color = Color.green);
pointerHandler.OnPointerUp.AddListener((e) => material.color = Color.magenta);
}
Afferrare gli eventi
L'esempio seguente mostra come rendere un GameObject trascinabile. Si supponga che l'oggetto gioco abbia un collisore su di esso.
public static void MakeNearDraggable(GameObject target)
{
// Instantiate and add grabbable
target.AddComponent<NearInteractionGrabbable>();
// Add ability to drag by re-parenting to pointer object on pointer down
var pointerHandler = target.AddComponent<PointerHandler>();
pointerHandler.OnPointerDown.AddListener((e) =>
{
if (e.Pointer is SpherePointer)
{
target.transform.parent = ((SpherePointer)(e.Pointer)).transform;
}
});
pointerHandler.OnPointerUp.AddListener((e) =>
{
if (e.Pointer is SpherePointer)
{
target.transform.parent = null;
}
});
}
API utili
NearInteractionGrabbable
NearInteractionTouchable
NearInteractionTouchableUnityUI
NearInteractionTouchableVolume
IMixedRealityTouchHandler
IMixedRealityPointerHandler