Jak přidat téměř interaktivitu – MRTK2

Blízké interakce mají podobu dotyků a uchopů. Události dotyku a uchopění jsou vyvolány jako události ukazatele pokePointer a SpherePointer v uvedeném pořadí.

K poslechu dotykového ovládání a/nebo získání vstupních událostí na konkrétním objektu GameObject jsou potřeba tři klíčové kroky.

  1. Ujistěte se, že je příslušný ukazatel zaregistrovaný v hlavním konfiguračním profilu MRTK.
  2. Ujistěte se, že požadovaný objekt GameObject má odpovídající komponentu pro uchopování nebo dotykové skripty a Unity Collider.
  3. Implementujte rozhraní vstupní obslužné rutiny v připojeném skriptu k požadovanému objektu GameObject, aby naslouchal událostem grab nebo touch .

Přidání interakcí s uchopem

  1. Ujistěte se, že je v profilu ukazatele MRTK zaregistrovaný objekt SpherePointer.

    Výchozí profil MRTK a výchozí profil HoloLens 2 již obsahují SpherePointer. Můžete potvrdit, že spherePointer bude vytvořen tak, že vyberete konfigurační profil MRTK a přejdete naMožnosti ukazatelevstupních>>ukazatelů. Výchozí GrabPointer prefab (Assets/MRTK/SDK/Features/UX/Prefabs/Pointers) by měl být uvedený s typem kontroleruartikulované ruky. Vlastní prefab lze použít, pokud implementuje SpherePointer třídu.

    Příklad profilu uchopení ukazatele

    Výchozí uchopte ukazatel na blízké objekty v kuželu kolem bodu zachycení tak, aby odpovídal výchozímu rozhraní HoloLens 2.

    Kuželové uchopte ukazatel

  2. Na GameObject, který by měl být uchopitelný, přidejte NearInteractionGrabbable, stejně jako uchytávače.

    Ujistěte se, že je vrstva objektu GameObject na uchopitelné vrstvě. Ve výchozím nastavení se dají uchopit všechny vrstvy kromě prostorového sledování a Ignore Raycasts . Podívejte se, které vrstvy se dají uchopit, a zkontrolujte masky vrstvy v prefabu GrabPointeru .

  3. Do objektu GameObject nebo některého z jeho předchůdců přidejte komponentu skriptu, která implementuje IMixedRealityPointerHandler rozhraní. Jakýkoli nadřazený objekt s objektem NearInteractionGrabbable bude také schopen přijímat události ukazatele.

Příklad kódu pro získání

Níže je skript, který se vytiskne, pokud je událost dotykem nebo uchopem. V příslušné IMixedRealityPointerHandler funkce rozhraní, lze se podívat na typ ukazatele, který aktivuje tuto událost prostřednictvím MixedRealityPointerEventData. Pokud je ukazatel SpherePointer, interakce je uchopení.

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

Přidání dotykových interakcí

Proces přidávání dotykových interakcí do elementů UnityUI se liší od procesu pro vanilla 3D GameObjects. Pokud chcete povolit komponenty uživatelského rozhraní Unity, můžete přeskočit na následující část , uživatelské rozhraní Unity.

U obou typů prvků uživatelského rozhraní se ale ujistěte, že je v profilu ukazatele MRTK zaregistrovaný PokePointer.

Výchozí profil MRTK a výchozí profil HoloLens 2 již obsahují PokePointer. Můžete potvrdit, že pokePointer bude vytvořen tak, že vyberete konfigurační profil MRTK a přejdete naMožnosti ukazatelevstupních>>ukazatelů. Výchozí prefab PokePointer (Assets/MRTK/SDK/Features/UX/Prefabs/Pointers) by měl být uvedený s typem kontroleruartikulované ruky. Vlastní prefab lze použít, pokud implementuje PokePointer třídu.

Příklad profilu ukazatele poke

3D objekty GameObjects

Existují dva různé způsoby, jak přidat dotykové interakce do 3D GameObjects, v závislosti na tom, jestli by váš 3D objekt měl mít pouze jednu dotknutelnou rovinu, nebo jestli by měl být dotykový na základě jeho celého uchytávače. První způsob je obvykle u objektů s BoxColliders, kde je žádoucí, aby pouze jedna tvář smykače reagovala na dotykové události. Druhý je pro objekty, které musí být dotknutelné z libovolného směru na základě jejich uchytávače.

Dotykové ovládání jedním obličejem

To je užitečné v situacích, kdy musí být dotykový pouze jeden obličej. Tato možnost předpokládá, že herní objekt má BoxCollider. Tuto možnost je možné použít u objektů, které nejsou BoxCollider. V takovém případě jsou vlastnosti Bounds a Local Center nastaveny ručně, aby bylo možné nakonfigurovat dotknutelnou rovinu (tj. Bounds by měly být nastaveny na nenulovou a nulovou hodnotu).

  1. Do objektu GameObject, který by měl být dotykový, přidejte BoxCollider a komponentu NearInteractionTouchable .

    1. Pokud používáte IMixedRealityTouchHandler rozhraní ve skriptu komponenty níže, nastavte Události na Příjem na Dotykové ovládání.

    2. Klikněte na Opravit hranice a Opravit střed.

    Nastavení NearInteractionTouchable

  2. Do tohoto objektu nebo některého z jeho nadřazených komponent přidejte komponentu skriptu, která implementujeIMixedRealityTouchHandler Rozhraní. Jakýkoli nadřazený objekt s objektem NearInteractionTouchable bude také schopen přijímat události ukazatele.

Poznámka

V zobrazení scény editoru s vybranou možností NearInteractionTouchable GameObject si všimněte bílého obrysu čtverce a šipky. Šipka ukazuje na "přední" dotknutelného panelu. Kolidovatelné bude možné dotýkat pouze z daného směru. Pokud chcete, aby se schlikovač dotýkal ze všech směrů, přečtěte si část o libovolném dotykovém ovládání schlikovače. NearInteractionTouchable Gizmos

Dotykové ovládání libovolného s collideru

To je užitečné v situacích, kdy herní objekt musí být dotknutelný podél celé tváře uchytávače. Můžete ho například použít k povolení dotykové interakce u objektu s objektem SphereCollider, kde musí být dotykový celý uchytávací modul.

  1. Do objektu GameObject, který by měl být dotykový, přidejte uchytávače a komponentu NearInteractionTouchableVolume .

    1. Pokud používáte IMixedRealityTouchHandler rozhraní ve skriptu komponenty níže, nastavte Události na Příjem na Dotykové ovládání.
  2. Do tohoto objektu nebo některého z jeho nadřazených komponent přidejte komponentu skriptu, která implementujeIMixedRealityTouchHandler Rozhraní. Jakýkoli nadřazený objekt s objektem NearInteractionTouchable bude také schopen přijímat události ukazatele.

Uživatelské rozhraní Unity

  1. Přidejte nebo ujistěte se, že je ve scéně plátno UnityUI .

  2. Do objektu GameObject, který by měl být dotykový, přidejte komponentu NearInteractionTouchableUnityUI .

    1. Pokud používáte IMixedRealityTouchHandler rozhraní ve skriptu komponenty níže, nastavte Události na Příjem na Dotykové ovládání.
  3. Do tohoto objektu nebo některého z jeho předchůdců přidejte komponentu skriptu, která implementuje IMixedRealityTouchHandler rozhraní. Všechny nadřazené objektu s objektem NearInteractionTouchableUnityUI budou také moci přijímat události ukazatele.

Důležité

Objekty se nemusí chovat podle očekávání, pokud jsou umístěny na překrývajících se objektech plátna. Aby se zajistilo konzistentní chování, nikdy nepřekrývejte objekty plátna ve vaší scéně.

Důležité

NearInteractionTouchable U komponenty skriptu jsou pro vlastnost Events to Receive k dispozici dvě možnosti: Ukazatel a Dotykové ovládání. Pokud používáte IMixedRealityPointerHandler rozhraní, nastavte Události na Příjem na Ukazatel a nastavte na Touch, pokud používáte IMixedRealityTouchHandler rozhraní ve skriptu komponenty, které reaguje na vstupní události nebo je zpracovává.

Příklad dotykového kódu

Následující kód ukazuje MonoBehaviour, který může být připojen k GameObject s variant komponentou NearInteractionTouchable a reagovat na události dotykového vstupu.

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

Příklady skriptů blízké interakce

Doteková událost

Tento příklad vytvoří datovou krychli, umožní její dotykové ovládání a změní barvu při dotykovém ovládání.

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

Akce pro získání

Následující příklad ukazuje, jak nastavit GameObject jako přetažení. Předpokládá, že herní objekt má na něm kolidlo.

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

Užitečná rozhraní API

Viz také