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.
- Ujistěte se, že je příslušný ukazatel zaregistrovaný v hlavním konfiguračním profilu MRTK.
- Ujistěte se, že požadovaný objekt GameObject má odpovídající komponentu pro uchopování nebo dotykové skripty a
Unity Collider
. - 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
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 implementujeSpherePointer
třídu.Výchozí uchopte ukazatel na blízké objekty v kuželu kolem bodu zachycení tak, aby odpovídal výchozímu rozhraní HoloLens 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 .
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 objektemNearInteractionGrabbable
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.
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).
Do objektu GameObject, který by měl být dotykový, přidejte BoxCollider a komponentu
NearInteractionTouchable
.Pokud používáte
IMixedRealityTouchHandler
rozhraní ve skriptu komponenty níže, nastavte Události na Příjem na Dotykové ovládání.Klikněte na Opravit hranice a Opravit střed.
Do tohoto objektu nebo některého z jeho nadřazených komponent přidejte komponentu skriptu, která implementuje
IMixedRealityTouchHandler
Rozhraní. Jakýkoli nadřazený objekt s objektemNearInteractionTouchable
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.
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.
Do objektu GameObject, který by měl být dotykový, přidejte uchytávače a komponentu
NearInteractionTouchableVolume
.- Pokud používáte
IMixedRealityTouchHandler
rozhraní ve skriptu komponenty níže, nastavte Události na Příjem na Dotykové ovládání.
- Pokud používáte
Do tohoto objektu nebo některého z jeho nadřazených komponent přidejte komponentu skriptu, která implementuje
IMixedRealityTouchHandler
Rozhraní. Jakýkoli nadřazený objekt s objektemNearInteractionTouchable
bude také schopen přijímat události ukazatele.
Uživatelské rozhraní Unity
Přidejte nebo ujistěte se, že je ve scéně plátno UnityUI .
Do objektu GameObject, který by měl být dotykový, přidejte komponentu
NearInteractionTouchableUnityUI
.- Pokud používáte
IMixedRealityTouchHandler
rozhraní ve skriptu komponenty níže, nastavte Události na Příjem na Dotykové ovládání.
- Pokud používáte
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 objektemNearInteractionTouchableUnityUI
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
NearInteractionGrabbable
NearInteractionTouchable
NearInteractionTouchableUnityUI
NearInteractionTouchableVolume
IMixedRealityTouchHandler
IMixedRealityPointerHandler