Přidání blízké interaktivity

Blízké interakce mají podobu dotyků a uchopování. Události dotykového ovládání a uchopování jsou vyvolány jako události ukazatele pomocí PokePointeru a SpherePointeruv uvedeném pořadí.

K naslouchání dotyku nebo uchopování vstupních událostí u konkrétního objektu GameObject se vyžaduje 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á příslušnou komponentu skriptu grab nebo touch a .
  3. Implementujte rozhraní obslužné rutiny vstupu na připojený skript k požadovanému objektu GameObject, abyste naslouchaly událostem uchopování nebodotyku.

Přidání interakcí s grab

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

    Výchozí profil MRTK a výchozí profil HoloLens 2 již obsahují SpherePointer. Vytvoření SpherePointeru můžete ověřit tak, že vyberete konfigurační profil MRTK a přejdete na Možnosti ukazatelevstupu. Výchozí GrabPointer předfab (Assets/MRTK/SDK/Features/UX/Prefabs/Pointers) by měl GrabPointer být uvedený s typem kontroleru articulated Hand. Vlastní předfab lze použít, pokud implementuje SpherePointer třídu .

    Příklad použití profilu ukazatele

    Výchozí příkaz grab pointer se dotazuje na okolní objekty v korelu kolem bodu grab tak, aby odpovídaly výchozímu rozhraní Hololens 2.

    Conical Grab Pointer

  2. V objektu GameObject, který by měl být možné uchopit, přidejte objekt NearInteractionGrabbable a metodu a metodu .

    Ujistěte se, že je vrstva objektu GameObject na uchopitelné vrstvě. Ve výchozím nastavení jsou všechny vrstvy kromě Spatial Awareness a Ignore Raycasts možné uchopit. Prohlédněte si masky vrstvy grabpointeru a podívejte se, které vrstvy je možné uchopit.

  3. Do objektu GameObject nebo jednoho z jeho předchůdců přidejte komponentu skriptu, která implementuje IMixedRealityPointerHandler rozhraní. Jakýkoli předchůdce objektu s objektem bude moci přijímat také události NearInteractionGrabbable ukazatele.

Příklad kódu pro grab

Níže je skript, který se vytiskne, pokud je událost dotykem nebo uchopit. V příslušné funkci rozhraní IMixedRealityPointerHandler se můžete podívat na typ ukazatele, který aktivuje tuto událost prostřednictvím . Pokud je ukazatel SpherePointer, je interakce záchytná.

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é interakce

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

U obou typů prvků uživatelského rozhraní se však ujistěte, že je v profilu ukazatele MRTKzaregistrovaný nástroj PokePointer.

Výchozí profil MRTK a výchozí profil HoloLens 2 již obsahují PokePointer. Vytvoření pokePointeru můžete ověřit tak, že vyberete konfigurační profil MRTK a přejdete na Možnostiukazatelevstupu. Výchozí PokePointer předfab (Assets/MRTK/SDK/Features/UX/Prefabs/Pointers) by měl PokePointer být uvedený s typem kontroleru articulated Hand. Vlastní předfab lze použít, pokud implementuje PokePointer třídu .

Příklad profilu ukazatele na nástroj Poke

3D GameObjects

Existují dva různé způsoby přidání dotykové interakce do 3D GameObjects v závislosti na tom, jestli by váš 3D objekt měl mít jenom jednu dotykovou rovinu, nebo jestli by měl být dotykovatelný na základě celého kolace. První způsob je obvykle u objektů s objekty BoxColliders, kde je žádoucí, aby na dotykové události reagovala jenom jedna tvář kolace. Druhá je pro objekty, které musí být dotykem v libovolném směru na základě jejich kolace.

Dotek s jednou tváří

To je užitečné k tomu, abyste umožnili situace, kdy je potřeba, aby byla dotyková jen jedna tvář. Tato možnost předpokládá, že herní objekt má BoxCollider. Tento parametr je možné použít u jiných objektů než BoxCollider. V takovém případě se vlastnosti Bounds (Meze) a Local Center (Místní centrum) nastaví ručně a nakonfigurují se dotyková rovina (to znamená, že meze by měly být nastaveny na nenulovou hodnotu).

  1. V objektu GameObject, který by měl být dotykový, přidejte BoxCollider a [ NearInteractionTouchable ] (xref:Microsoft.MixedReality.Toolkit. Input.NearInteractionTouchable).

    1. Pokud používáte [ ] (xref:Microsoft.MixedReality.Toolkit, nastavte Events na Receive (Přijímat) na Touch. Input.IMixedRealityTouchHandler) ve skriptu komponenty níže.

    2. Klikněte na Opravit meze a centrum oprav.

    NearInteraction Touchable Setup

  2. Do tohoto objektu nebo jednoho z nadřazených objektů přidejte komponentu skriptu, která implementujeIMixedRealityTouchHandler Rozhraní. Všechny předchůdce objektu s [ NearInteractionTouchable ] (xref:Microsoft.MixedReality.Toolkit. Input.NearInteractionTouchable) bude moct přijímat také události ukazatele.

Poznámka

V zobrazení scény editoru s vybranou vlastností NearInteraction Touchable GameObject si všimněte čtverce a šipky s bílým obrysem. Šipka ukazuje na přední část dotykového ovládání. S kolabilní bude možné se dotát jen z tohoto směru. Informace o tom, jak zajistit dotykové ovládání kolace ze všech směrů, najdete v části o libovolném kolabátu. NearInteraction Touchable Gizmos

Libovolný kolace dotek

To je užitečné k tomu, abyste umožnili situace, kdy je potřeba, aby byl herní objekt dotykem na celé své tváře. To se například může použít k umožnění dotykové interakce pro objekt s objektem SphereCollider, kde musí být celý kolace dotykový.

  1. V objektu GameObject, který by měl být dotykový, přidejte kolace a [ NearInteractionTouchableVolume ] (xref:Microsoft.MixedReality.Toolkit. Input.NearInteractionTouchableVolume).

    1. Pokud používáte [ ] (xref:Microsoft.MixedReality.Toolkit, nastavte Events na Receive (Přijímat) na Touch. Input.IMixedRealityTouchHandler) ve skriptu komponenty níže.
  2. Do tohoto objektu nebo jednoho z nadřazených objektů přidejte komponentu skriptu, která implementujeIMixedRealityTouchHandler Rozhraní. Všechny předchůdce objektu s [ NearInteractionTouchable ] (xref:Microsoft.MixedReality.Toolkit. Input.NearInteractionTouchable) bude moct přijímat také události ukazatele.

Uživatelské rozhraní Unity

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

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

    1. Pokud používáte rozhraní níže ve skriptu komponenty, nastavte Události na Receive to Touch (Přijímat na dotykové ovládání).
  3. Na tento objekt nebo jeden z nadřazených objektů přidejte komponentu skriptu, která implementuje IMixedRealityTouchHandler rozhraní. Jakýkoli předchůdce objektu s objektem bude moci přijímat také NearInteractionTouchableUnityUI události ukazatele.

Důležité

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

Důležité

V NearInteractionTouchable komponentě skriptu má vlastnost NearInteractionTouchable dvě možnosti: Pointer (Ukazatel) a Touch (Dotykové ovládání). Pokud používáte rozhraní , nastavte Události na Receive to Pointer a pokud používáte rozhraní ve skriptu komponenty, které reaguje na vstupní události nebo zpracovává je, nastavte na Touch.

Příklad dotykového kódu

Následující kód ukazuje objekt MonoBehaviour, který lze připojit k objektu GameObject s variantní komponentou a NearInteractionTouchable 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ů pro blízkou interakci

Doteková událost

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

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

Uchopit události

Následující příklad ukazuje, jak vytvořit objekt GameObject, který lze přetáhnout. Předpokládá, že herní objekt má na objektu kolace.

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é