Közel interaktivitás hozzáadása

A közel interakciók érintések és megragadás formájában jönnek létre. A Touch és a Grab eseményeket a AndPointer és a SpherePointerhozza fel mutatóeseményként.

Egy adott GameObject érintéses és/vagy bemeneti eseményeinek figyelése három fő lépésből áll.

  1. Győződjön meg arról, hogy a releváns mutató regisztrálva van a fő MRTK-konfigurációs profilban.
  2. Győződjön meg arról, hogy a kívánt GameObject rendelkezik a megfelelő kötő vagy érintéses szkriptösszetevővel és .
  3. Implementálja a bemeneti kezelőfelületet egy, a kívánt GameObjecthez csatolt szkripten, hogy figyelje a ragadó vagy érintéses eseményeket.

Ragadó interakciók hozzáadása

  1. Győződjön meg arról, hogy a SpherePointer regisztrálva van az MRTK-mutató profilban.

    Az alapértelmezett MRTK-profil és az alapértelmezett HoloLens 2-es profil már tartalmaz egy SpherePointert. A SpherePointer létrejöttének megerősítéséhez válassza ki az MRTK-konfigurációs profilt, és navigálja a Bemenetimutatómutatói mutató beállításai elemre. Az alapértelmezett GrabPointer előfab (Assets/MRTK/SDK/Features/UX/Prefabs/Pointers) vezérlőtípussal kell felsorolva lennie.GrabPointer Az egyéni prefab akkor használható, ha implementálja a SpherePointer osztályt.

    Példa mutatóprofilra

    Az alapértelmezett markolat lekérdezi a közeli objektumokat a fogópont körül, hogy azok megegyeznek az alapértelmezett Hololens 2 felülettel.

    Conical Grab Pointer

  2. A megragadható GameObjecthez adjon hozzá egy et NearInteractionGrabbable és egy collidert.

    Győződjön meg arról, hogy a GameObject rétege egy megragadható rétegen található. Alapértelmezés szerint a Spatial Awareness és az Ignore Raycasts kivételével minden réteg megragadható. A GrabPointer előfedőben található Grab Layer Masks vizsgálatával láthatja, hogy mely rétegek ragadhatók meg.

  3. A GameObjecten vagy annak egyik elődjében adjon hozzá egy szkriptösszetevőt, amely megvalósítja a IMixedRealityPointerHandler felületet. Az objektum és a elődje is képes lesz NearInteractionGrabbable mutatóeseményeket fogadni.

Példakód le ragadás

Az alábbiakban egy szkript látható, amely ki lesz nyomtatva, ha egy esemény érintéssel vagy érintéssel történik. A megfelelő IMixedRealityPointerHandler felületi függvényben meg lehet nézni azt a mutatótípust, amely a használatával aktiválja az eseményt. Ha a mutató egy SpherePointer,akkor az interakció egy megragadás.

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

Érintéses interakciók hozzáadása

Az érintéses interakciók UnityUI-elemekhez való hozzáadásának folyamata eltér a vanilla 3D GameObjects-elemektől. A Unity felhasználói felületi összetevőinek engedélyezéséhez ugorjon a következő szakaszra, a Unityfelhasználói felületére.

Mindkét UX-elemtípus esetében azonban győződjön meg arról, hogy a Rendszerképpont regisztrálva van az MRTK-mutató profilban.

The default MRTK profile and the default HoloLens 2 profile already contain a PokePointer. Az MRTK-konfigurációs profil kiválasztásával és az InputPointers Pointer Options (Bemeneti mutatók mutatói mutató beállításai) elemre navigálva meggyőződhet arról, hogy a Rendszer létre fog-e hozatni egyÖn által létrehozott ProfilPointert. Az PokePointer alapértelmezett (Assets/MRTK/SDK/Features/UX/Prefabs/Pointers) előfedőnek PokePointer a Vezérlő típusa típusú kéz beállítással kell megjelenik. Az egyéni prefab akkor használható, ha implementálja a PokePointer osztályt.

Példa a Mutatómutató profilra

3D GameObjects

A 3D GameObjectshez két különböző módon adhat hozzá érintéses interakciókat attól függően, hogy a 3d objektumnak csak egyetlen érintésre használható síkkal kell-e lennie, vagy hogy a teljes összeütköztető alapján kezelhetőnek kell-e lennie. Az első módszer általában a BoxColliderst használják az objektumokon, ahol azt szeretné, hogy az összeütközőknek csak egyetlen arca reagáljon az érintéses eseményekre. A másik az olyan objektumokhoz való, amelyeknek az összeütköztetőjüktől függően bármilyen irányból érinthetőnek kell lennie.

Egy arc érintése

Ez akkor hasznos, ha olyan helyzetekre van szükség, amikor csak egyetlen arcnak kell megérinthetőnek lennie. Ez a lehetőség feltételezi, hogy a játékobjektum rendelkezik BoxColliderrel. Nem BoxCollider objektumokkal is használható, ebben az esetben a "Bounds" (Kötések) és a "Local Center" (Helyi központ) tulajdonságokat sok esetben manuálisan kell beállítani az érintőképernyős sík konfigurálása érdekében (azaz a Bounds tulajdonságot nullától különböző értékre kell állítani).

  1. A Kezelhető GameObjecten adjon hozzá egy BoxCollider és egy [ NearInteractionTouchable ] (xref:Microsoft.MixedReality.Toolkit.Input.NearInteraction Touchable) összetevőt.

    1. Állítsa az Eseményeket Receive to Touch módra, ha az alábbi összetevő-szkript [] (xref:Microsoft.MixedReality.Toolkit.Input.IMixedReality TouchHandler) felületét használja.

    2. Kattintson a Fix bounds (Kötések kijavítása) és a Fix Center (Középpont kijavítás) lehetőségre

    NearInteractionTouchable beállítás

  2. Az adott objektumon vagy annak egyik elődjére adjon hozzá egy szkriptösszetevőt, amely megvalósítja aIMixedRealityTouchHandler Felület. Az objektumnak a [ NearInteractionTouchable ] (xref:Microsoft.MixedReality.Toolkit.Input.NearInteractionTouchable) elődje is fogadhat mutatóeseményeket.

Megjegyzés

A szerkesztő jelenetnézetében, ahol a NearInteractionTouchable GameObject van kiválasztva, figyelje meg a fehér körvonalú négyzetet és a nyilat. A nyíl az érintéses elem "elejére" mutat. Az összeütközhető csak abból az irányból lesz kezelhető. Ahhoz, hogy egy összeütközhető legyen minden irányból, tekintse meg a tetszőleges összeütköző érintés szakaszát. NearInteractionTouchable Gizmos

Tetszőleges összeütköző érintés

Ez akkor hasznos, ha olyan helyzetekre van szükség, amikor a játékobjektumnak a teljes összeütközhető arccal együtt kell érinthetőnek lennie. Ezzel például érintéses interakciók engedélyezhetők egy objektum és egy SphereCollider között, ahol a teljes összeütközőnek érintéssel kezelhetőnek kell lennie.

  1. A Kezelhető GameObjecten adjon hozzá egy [ ] NearInteractionTouchableVolume (xref:Microsoft.MixedReality.Toolkit.Input.NearInteraction TouchableVolume) összetevőt.

    1. Állítsa az Eseményeket Receive to Touch módra, ha az alábbi összetevő-szkript [] (xref:Microsoft.MixedReality.Toolkit.Input.IMixedReality TouchHandler) felületét használja.
  2. Az adott objektumon vagy annak egyik elődjére adjon hozzá egy szkriptösszetevőt, amely megvalósítja aIMixedRealityTouchHandler Felület. Az objektumnak a [ NearInteractionTouchable ] (xref:Microsoft.MixedReality.Toolkit.Input.NearInteractionTouchable) elődje is fogadhat mutatóeseményeket.

Unity felhasználói felület

  1. Adja hozzá/győződjön meg arról, hogy a jelenetben van UnityUI-vászon.

  2. Adjon hozzá egy összetevőt a GameObjecthez, amely érintéssel NearInteractionTouchableUnityUI kezelhető.

    1. Állítsa az Eseményeket Receive to Touch (Fogadás érintésre) beállításra, ha az alábbi összetevő-szkriptben az interfészt használja.
  3. Az objektumon vagy annak egyik elődjére adjon hozzá egy szkriptösszetevőt, amely megvalósítja a IMixedRealityTouchHandler felületet. Az objektum bármely elődje és a is képes lesz NearInteractionTouchableUnityUI mutatóeseményeket fogadni.

Fontos

Előfordulhat, hogy az objektumok nem a várt módon viselkednek, ha átfedő vászonobjektumon találhatók. A konzisztens viselkedés biztosítása érdekében soha ne fedjük át a vásznon lévő objektumokat a jelenetben.

Fontos

A NearInteractionTouchable szkriptösszetevőben az Események fogadása NearInteractionTouchable két lehetőség közül választhat: Pointer (Mutató) és Touch (Érintés). Ha a felületet használja, állítsa az Események fogadása mutatóra, a bemeneti eseményeket kezelő vagy válaszoló összetevőszk szkriptben pedig a Touch (Érintés) beállításra.

Touch-kód – példa

Az alábbi kód egy MonoBehaviour-t mutat be, amely csatolható egy GameObjecthez egy változat-összetevővel, és reagálhat az NearInteractionTouchable érintéses bemeneti eseményekre.

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

Közel interakciós szkriptek példái

Érintéses események

Ez a példa egy kockát hoz létre, érintésre használhatóvá teszi, és érintéssel módosítja a színét.

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

Események megragadése

Az alábbi példa bemutatja, hogyan lehet egy GameObjectet áthúzni. Azt feltételezi, hogy a játékobjektumon egy collider (összeütköztető) van.

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

Hasznos API-k

Lásd még