Come aggiungere un'interazione vicina in MRTK

Le interazioni nelle vicinanze sono sotto forma di tocchi e afferramenti. Gli eventi di tocco e di afferrare vengono generati rispettivamente come eventi puntatore da PokePointer e SpherePointer.

Sono necessari tre passaggi chiave per restare in ascolto degli eventi di input touch e/o grab in un determinato GameObject.

  1. Assicurarsi che il puntatore pertinente sia registrato nel profilo di configurazione MRTK principale.
  2. Verificare che l'oggetto GameObject desiderato abbia il componente di script di tocco o di tocco appropriato e Unity Collider .
  3. Implementare un'interfaccia del gestore di input in uno script associato all'oggetto GameObject desiderato per restare in ascolto degli eventi di tocco o di cattura.

Aggiungere interazioni di afferrare

  1. Assicurarsi che SpherePointer sia registrato nel profilo puntatore MRTK.

    Il profilo MRTK predefinito e il profilo HoloLens 2 predefinito contengono già spherePointer. È possibile confermare che verrà creato un SpherePointer selezionando il profilo di configurazione MRTK e passando a Opzioni puntatore > > puntatore di input. Il GrabPointer prefab predefinito (Assets/MRTK/SDK/Features/UX/Prefabs/Pointers) deve essere elencato con un tipo di controller di mano articolata. Un prefab personalizzato può essere utilizzato purché implementi la SpherePointer classe .

    Esempio di profilo puntatore Grab

    Il puntatore grab predefinito esegue una query per gli oggetti vicini in un cono intorno al punto di afferrare in modo che corrisponda all'interfaccia predefinita di Hololens 2.

    Puntatore conical Grab

  2. Nell'oggetto GameObject che deve essere afferrabile aggiungere , NearInteractionGrabbable nonché un collisore.

    Assicurati che il livello del GameObject si trova su un livello afferrabile. Per impostazione predefinita, tutti i livelli, ad eccezione di Consapevolezza spaziale e Ignora raycast, sono afferrabili. Scopri quali livelli possono essere afferrati esaminando le maschere di livello grab nel prefab GrabPointer.

  3. Nel GameObject o in uno dei relativi predecessori aggiungere un componente script che implementa IMixedRealityPointerHandler l'interfaccia . Qualsiasi predecessore dell'oggetto con sarà in grado di ricevere anche gli eventi del NearInteractionGrabbable puntatore.

Esempio di codice Grab

Di seguito è riportato uno script che verrà stampato se un evento è un tocco o una cattura. Nella funzione di interfaccia IMixedRealityPointerHandler pertinente è possibile esaminare il tipo di puntatore che attiva l'evento tramite MixedRealityPointerEventData . Se il puntatore è un SpherePointer, l'interazione è una cattura.

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 rispetto ai GameObject 3D vanilla. È 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 HoloLens 2 predefinito contengono già un oggetto PokePointer. È possibile confermare che verrà creato un PokePointer selezionando il profilo di configurazione di MRTK e passare a Input > Pointers Pointer > Options (Opzioni puntatore di input). Il PokePointer prefab predefinito (Assets/MRTK/SDK/Features/UX/Prefabs/Pointers) deve essere elencato con il tipo di controller Mano articolata. Un prefab personalizzato può essere utilizzato purché implementi la PokePointer classe .

Esempio di profilo puntatore Poke

GameObject 3D

Esistono due modi diversi per aggiungere interazioni tramite tocco ai GameObject 3D, a seconda che l'oggetto 3D debba avere un solo piano toccabile o se deve essere toccabile in base all'intero collisore. Il primo modo è in genere sugli oggetti con BoxColliders, in cui si desidera che solo un singolo viso del collisore reagisca agli eventi di tocco. L'altro è per gli oggetti che devono essere toccabili da qualsiasi direzione in base al collisore.

Tocco con un singolo viso

Ciò è utile per abilitare situazioni in cui un solo viso deve essere toccabile. Questa opzione presuppone che l'oggetto gioco abbia un oggetto BoxCollider. è possibile usarlo con oggetti non BoxCollider, nel qual caso le proprietà "Bounds" e "Local Center" possono essere impostate manualmente per configurare il piano toccabile( ad esempio, i limiti devono essere impostati su un valore diverso da zero).

  1. In GameObject che deve essere toccabile aggiungere un componente BoxCollider e un componente [ NearInteractionTouchable ] (xref:Microsoft.MixedReality.Toolkit.Input.NearInteractionTouchable).

    1. Impostare Events su Receive su Touch se si usa l'interfaccia [ ] IMixedRealityTouchHandler (xref:Microsoft.MixedReality.Toolkit.Input.IMixedRealityTouchHandler) nello script del componente seguente.

    2. Fare clic su Correggi limiti e centro correzioni

    NearInteractionTouchable Setup

  2. In tale oggetto o in uno dei relativi predecessori aggiungere un componente script che implementa l'oggetto IMixedRealityTouchHandler . Anche qualsiasi predecessore dell'oggetto con [ NearInteractionTouchable ] (xref:Microsoft.MixedReality.Toolkit.Input.NearInteractionTouchable) sarà in grado di ricevere eventi puntatore.

Nota

Nella visualizzazione della scena dell'editor con l'oggetto NearInteractionTouchable GameObject selezionato, notare un quadrato con contorno bianco e una freccia. La freccia punta alla "parte anteriore" dell'oggetto toccabile. L'oggetto collidable sarà toccabile solo da quella direzione. Per rendere un collisore toccabile da tutte le direzioni, vedere la sezione sul tocco del collisore arbitrario. NearInteractionTouchable Gizmos

Tocco del collisore arbitrario

Ciò è utile per abilitare situazioni in cui l'oggetto del gioco deve essere toccabile lungo l'intero viso del collisore. Ad esempio, può essere usato per abilitare le interazioni tramite tocco per un oggetto con sphereCollider, in cui l'intero collisore deve essere toccabile.

  1. In GameObject che deve essere toccabile aggiungere un collisore e un componente [ NearInteractionTouchableVolume ] (xref:Microsoft.MixedReality.Toolkit.Input.NearInteractionTouchableVolume).

    1. Impostare Events su Receive su Touch se si usa l'interfaccia [ ] IMixedRealityTouchHandler (xref:Microsoft.MixedReality.Toolkit.Input.IMixedRealityTouchHandler) nello script del componente seguente.
  2. In tale oggetto o in uno dei relativi predecessori aggiungere un componente script che implementa l'oggetto IMixedRealityTouchHandler . Anche qualsiasi predecessore dell'oggetto con [ NearInteractionTouchable ] (xref:Microsoft.MixedReality.Toolkit.Input.NearInteractionTouchable) sarà in grado di ricevere eventi puntatore.

Interfaccia utente di Unity

  1. Aggiungere/verificare che nella scena sia presente un canvas UnityUI.

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

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

Importante

Gli oggetti potrebbero non comportarsi come previsto se si trovano su oggetti canvas sovrapposti. Per garantire un comportamento coerente, non sovrapporre mai gli oggetti canvas nella scena.

Importante

Nel componente NearInteractionTouchable script, per la proprietà Eventi da ricevere sono disponibili due opzioni: Puntatore e Tocco. Impostare Events su Receive su Pointer se si usa l'interfaccia e impostare su Touch se si usa l'interfaccia nello script del componente che IMixedRealityPointerHandler IMixedRealityTouchHandler risponde/gestisce gli eventi di input.

Esempio di codice touch

Il codice seguente illustra un oggetto MonoBehaviour che può essere collegato a un GameObject con un componente variant e rispondere agli NearInteractionTouchable 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 nelle vicinanze

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);
}

Eventi grab

L'esempio seguente mostra come rendere trascinabile un oggetto GameObject. Presuppone che l'oggetto gioco abbia un collisore.

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