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.

  1. Verificare che il puntatore pertinente sia registrato nel profilo di configurazione MRTK principale.
  2. Verificare che il GameObject desiderato disponga del componente di script di tocco o di afferramento appropriato e .Unity Collider
  3. 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

  1. 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 la SpherePointer classe .

    Esempio di profilo del puntatore di afferramento

    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.

    Puntatore a afferramento conico

  2. Nel GameObject che deve essere afferrabile aggiungere un NearInteractionGrabbableoggetto , 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 .

  3. Nel GameObject o in uno dei relativi predecessori aggiungere un componente script che implementa l'interfaccia IMixedRealityPointerHandler . Qualsiasi predecessore dell'oggetto con NearInteractionGrabbable 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 .

Esempio di profilo del puntatore poke

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).

  1. Nel GameObject che deve essere toccabile aggiungere boxCollider e un NearInteractionTouchable componente.

    1. Impostare Eventi su Ricevi su Tocco se si usa l'interfaccia IMixedRealityTouchHandler nello script del componente seguente.

    2. Fare clic su Correggi limiti e centro correzioni

    Installazione di NearInteractionTouchable

  2. In tale oggetto o in uno dei relativi predecessori aggiungere un componente script che implementa l'oggettoInterfaccia IMixedRealityTouchHandler. Qualsiasi predecessore dell'oggetto con NearInteractionTouchable 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. NearInteractionTouchable Gizmos

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.

  1. Nel GameObject che deve essere toccabile aggiungere un collisore e un NearInteractionTouchableVolume componente.

    1. Impostare Eventi su Ricevi su Tocco se si usa l'interfaccia IMixedRealityTouchHandler nello script del componente seguente.
  2. In tale oggetto o in uno dei relativi predecessori aggiungere un componente script che implementa l'oggettoInterfaccia IMixedRealityTouchHandler. Qualsiasi predecessore dell'oggetto con NearInteractionTouchable sarà in grado di ricevere anche gli eventi del puntatore.

Interfaccia utente di Unity

  1. Aggiungere/verificare che nella scena sia presente un'area di disegno UnityUI .

  2. Nel GameObject che deve essere toccabile aggiungere un NearInteractionTouchableUnityUI componente.

    1. Impostare Eventi su Ricevi su Tocco se si usa l'interfaccia IMixedRealityTouchHandler nello script del componente seguente.
  3. In tale oggetto o in uno dei relativi predecessori aggiungere un componente script che implementa l'interfaccia IMixedRealityTouchHandler . Qualsiasi predecessore dell'oggetto con NearInteractionTouchableUnityUI 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

Vedi anche