Mutatók

Mutató

Ez a cikk azt ismerteti, hogyan konfigurálhatja a mutató bemenetét a gyakorlatban, és hogyan válaszolhat rá a mutatóarchitektúrához képest

A mutatók automatikusan példányosulnak futásidőben, amikor a rendszer új vezérlőt észlel. Vezérlőhöz több mutató is csatolható. Az alapértelmezett mutatóprofillal például a Windows Mixed Reality vezérlők egy vonalat és egy parabolikus mutatót is kapnak a normál kijelöléshez és a teleportáláshoz.

Mutató konfigurálása

A mutatók az MRTK bemeneti rendszerének részeként vannak konfigurálva egy MixedRealityPointerProfile segítségével. Ez a profiltípus az MixedRealityInputSystemProfile MRTK Configuration Inspectorban van hozzárendelve egyhez. A Mutató profil határozza meg a kurzort, a futásidőben elérhető mutatók típusait, valamint azt, hogy ezek a mutatók hogyan kommunikálnak egymással annak eldöntése érdekében, hogy melyik aktív.

  • Pointing Extent (Kiterjedés rámutatáskor) – Meghatározza azt a maximális távolságot, amelynek a mutatója interakcióba léphet a GameObjecttal.

  • A Raycast Layer Masks (Raycast rétegmaszkok) mutatása – Ez a LayerMasks (Rétegmaszkok) egy rangsorolt tömbje, amely meghatározza, hogy egy adott mutató mely lehetséges GameObjecteket használhatja, és hogy milyen sorrendben próbálkozhat az interakcióval. Ez hasznos lehet annak biztosításához, hogy a mutatók először a felhasználói felület elemeivel kommunikálnak, mielőtt más jelenetobjektumokat adnál. Példa mutatóprofilra

Mutató beállításainak konfigurálása

Az MRTK-mutatóprofil alapértelmezett konfigurációja a következő mutatóosztályokat és a társított előregyártottságokat tartalmazza. A rendszer számára futásidőben elérhető mutatók listája a Mutatóprofil Mutató beállításai alatt van meghatározva. A fejlesztők ezt a listát felhasználhatják a meglévő mutatók újrakonfigurálásához, új mutatók hozzáadásához vagy egy adott mutató törléséhez.

Példa mutató beállításai profilra

Az egyes mutatóbejegyzéseket az alábbi adatkészlet határozza meg:

  • Vezérlő típusa – A vezérlők készlete, amelyekre mutató érvényes.

    • Például a AndPointer felelős az objektumok "kiszúrásáért" egy ujjlenyomattal, és alapértelmezés szerint csak a kézvezérlő típusát támogató jelöléssel van megjelölve. A mutatók csak akkor példányosulnak, ha egy vezérlő elérhetővé válik, és különösen a Vezérlő típusa határozza meg, hogy a mutató előrefabja milyen vezérlőkhöz használható.
  • Üresjárat – lehetővé teszi, hogy a mutató csak egy adott kéz példányosulásához (bal/jobb)

Megjegyzés

Ha a Mutató bejegyzés Alaptulajdonság tulajdonságát None (Nincs) értékre adjuk, az gyakorlatilag letiltja azt a rendszerből a mutatónak a listából való eltávolításának alternatívájaként.

  • Mutató előrefab – Ez az előrefab adateszköz akkor lesz példányosulva, amikor a rendszer elkezdi nyomon követni a megadott vezérlőtípusnak és -átadhatóságnak megfelelő vezérlőt.

Egy vezérlőhöz több mutató is társítva lehet. Például az DefaultHoloLens2InputSystemProfile (Assets/MRTK/SDK/Profiles/HoloLens2/) esetében a fejkiált kézvezérlő a Következőhöz van társítva: DefaultHoloLens2InputSystemProfile, a GrabPointer, és a DefaultControllerPointer (pl. kézcsomópontok).

Megjegyzés

Az MRTK mutató-előtagkészleteket biztosít az Assets/MRTK/SDK/Features/UX/Prefabs/Pointers (Eszközök/MRTK/SDK/Features/UX/Prefabs/Pointers) alatt. Új egyéni előfab is létrehozható, ha az az Assets/MRTK/SDK/Features/UX/Scripts/Pointers vagy bármely más, -t végrehajtó szkript egyik mutatószk szkriptet tartalmazza.

Alapértelmezett mutatóosztályok

A következő osztályok a már használható MRTK-mutatók, amelyek a fent ismertetett alapértelmezett MRTK-mutatóprofilban vannak definiálva. Az Assets/MRTK/SDK/Features/UX/Prefabs/Pointers alatt megadott összes mutató-előfab tartalmaz egy csatolt mutató-összetevőt.

AZ MRTK alapértelmezett mutatói

Távoli mutatók

LinePointer

A LinePointeralapmutatóosztály egy vonalat rajzol a bemenet forrásától (azaz a vezérlőtől) a mutató irányában, és egyetlen sugárvetítást támogat ebben az irányban. Az olyan gyermekosztályok, mint a és a teleportmutatók általában példányosítják és használják (amelyek vonalakkal jelzik, hogy hol fog végződni a távportálás), nem pedig ez az osztály, amely elsősorban általános funkciókat ShellHandRayPointer biztosít.

Az Olyan mozgásvezérlők esetén, mint az Oculus, a Vive és Windows Mixed Reality, a rotáció megegyezik a vezérlő rotációval. Más vezérlők, például HoloLens 2 kéz esetén a rotáció megegyezik a rendszer által biztosított, a kéz rámutatási testével.

MRTK-mutatóvonal
CurvePointer

A CurvePointer úgy bővíti a LinePointer osztályt, hogy lehetővé teszi a többlépéses sugárképeket egy görbe mentén. Ez az alapmutatóosztály olyan ívelt példányok esetén hasznos, mint például a teleportációs mutatók, ahol a vonal konzisztensen egy parabolába kerül.

ShellHandRayPointer

A rendszer a rendszertől kiterjedt ShellHandRayPointerimplementációját használja alapértelmezettként az MRTK-mutatóprofilhoz. A DefaultControllerPointer előfab implementálja a osztályt.

GGVPointer

A Tekintet/kézmozdulat/hang (GGV) mutatóként is ismert GGVPoint HoloLens er 1 stílusú megjelenési és koppintásos interakciókat is lehetővé tett, elsősorban a Tekintet és légi koppintás vagy a Tekintet és hang kiválasztása interakción keresztül. A GGV-mutató pozícióját és irányát a fej pozíciója és elforgatása vezéreli.

TouchPointer

A TouchPointer felelős a Unity Touch-bemenet (azaz az érintőképernyő) kezeléséért. Ezek azért "távoli interakciók", mert a képernyő érintése a kamera egyik lehetséges távoli helyére fogja átképezni a sugárjelet.

MousePointer

A MousePointer a távoli interakciókhoz, de érintés helyett egérrel világba hoz egy képernyőt.

Egérmutató

Megjegyzés

Az egér támogatása alapértelmezés szerint nem érhető el az MRTK-ban, de engedélyezhető egy új típusú bemeneti adatszolgáltató MRTK bemeneti profilhoz való hozzáadásával és az adatszolgáltatóhoz való MixedRealityMouseInputProfile hozzárendelését.

Közelmutatók

PokePointer

A MertaPointer olyan játékobjektumokkal kommunikál, amelyek támogatják a "közel kezelhető interakciót". amelyek olyan GameObjects-fájlok, amelyekhez hozzá van NearInteractionTouchable csatolva a szkript. A UnityUI esetében ez a mutató a NearInteractionTouchableUnityUIs-t keres. A MertaPointer egy SphereCast használatával határozza meg a legközelebbi érintésre használható elemet, és olyan dolgok megnyomásra használható, mint a megnyomható gombok.

Amikor a GameObjectet az összetevővel konfigurálja, ügyeljen arra, hogy a localForward paramétert úgy konfigurálja, hogy a gomb vagy más objektum előlapjára mutasson, amely érintéssel NearInteractionTouchable kezelhetővé válik. NearInteractionTouchable Arról is győződjön meg, hogy az érintéses tárgyhatárok megegyeznek az érintéssel kezelhető objektumhatárokkal.

Hasznos Mutatómutató-tulajdonságok:

  • TouchableDistance:Az a maximális távolság, amellyel egy érintéssel kezelhető felület kezelhető
  • Vizualizációk:Az ujjlenyomat-tipp vizualizáció megjelenítésére használt játékobjektum (alapértelmezés szerint az ujjlenyomatos kör).
  • Vonal:Választható vonal, amely az ujjlenyomattól az aktív beviteli felületig rajzolható.
  • Rétegréteg-maszkok – A LayerMasks rangsorolt tömbje, amely meghatározza, hogy a mutató milyen lehetséges GameObjectekkel kommunikálhat, és milyen sorrendben próbálkozhat az interakcióval. Vegye figyelembe, hogy a GameObjectnek egy összetevővel is kell lennie, hogy használni tud egy NearInteractionTouchable nyílmutatót.
Mutató
SpherePointer

A SpherePointera UnityEngine.Physics.OverlapSphere segítségével azonosítja az interakcióhoz legközelebbi objektumot, ami hasznos lehet olyan "megragadható" bemenetek esetén, mint a . A funkcionális párhoz hasonlóan ahhoz, hogy kezelhető legyen a Sphere-mutatóval, a játékobjektumnak tartalmaznia kell egy PokePointer/NearInteractionTouchable parancsfájlt tartalmazó NearInteractionGrabbable összetevőt.

Mutató megragadása

Hasznos Sphere-mutató tulajdonságai:

  • Sphere Cast Radius: A megragadható objektumok lekérdezéséhez használt kör sugara.
  • Near Object Margin (Objektum margójaközelében): A Sphere-áttördítési sugár tetején található távolság, amely alapján lekérdezhető, hogy egy objektum a mutató közelében van-e. A közel objektumészlelési sugár összesen a Sphere Cast Radius + Near Object Margin
  • Near Object Sector Angle(Objektum szektorleállásának közelében): A közeli objektumok lekérdezésére a mutató előretolási tengelye körüli szög. Úgy teszi IsNearObject a lekérdezési függvényt, mint egy tőcsomó. Ez alapértelmezés szerint 66 fokra van állítva, hogy megfeleljen a Hololens 2 viselkedésének

A Sphere-mutató úgy lett módosítva, hogy csak a továbbítási irányban lévő objektumokat lekérdezésre

  • Near Object Smoothing Factor: Smoothing factor for Near Object detection (Objektumsimításitényező közelében): Smoothing factor for Near Object detection .. Ha a rendszer egy objektumot észlel az Objektum közelében lévő sugárban, akkor a lekérdezett sugár az Objektum sugara közelében lesz * (1 + Objektumsimítási tényező közelében) a bizalmasság csökkentése és az észlelési tartomány elhagyása érdekében.
  • Grab Layer Masks (Rétegmaszkok megragadása) – A LayerMasks rangsorolt tömbje, amely meghatározza, hogy a mutató mely lehetséges GameObjecteket használhatja, és hogy milyen sorrendben próbálja meg megkísérelni az interakciót. Vegye figyelembe, hogy a GameObjectnek egy -nek is lennie kell a NearInteractionGrabbable SpherePointerrel való interakcióhoz.

    Megjegyzés

    A Spatial Awareness réteg le van tiltva az MRTK által biztosított alapértelmezett GrabPointer-előfában. Ez a teljesítményre gyakorolt hatás csökkentése érdekében történik, amikor átfedésben van a térbeli hálóval. Ezt a GrabPointer-előfab módosításával engedélyezheti.

  • Colliders Not in FOV (Nem az FOV-ban) colliders figyelmen kívül hagyása – Azt határozza meg, hogy figyelmen kívül hagyja-e a mutató közelében lévő, de a vizualizáció FOV-ját nem ábrázoló collidereket. Ez megakadályozhatja a véletlen kézbe ragadásokat, és lehetővé teszi, hogy a kéz sugárai be tudjanak kapcsolni, amikor egy kézhez közel van, de nem látja. A Visual FOV a tipikus frustum helyett egy tővel van definiálva teljesítménybeli okokból. Ez a tasak ugyanolyan középre van orientált és orientált, mint a kamera frustumja, és a sugara egyenlő a kijelzendő magasság (vagy függőleges FOV) felével.
Sphere-mutató

Teleport-mutatók

  • TeleportPointer A egy teleportálásra vonatkozó kérést ad a felhasználó áthelyezése érdekében a művelet (vagyis a teleport gomb megnyomása) esetén.
  • ParabolicTeleportPointer A a művelet (azaz a teleport gomb megnyomásakor) parabolikus vonalú sugáradással való mozgatása esetén teleportkérést fog kérni.
Mutató parabolikus

A vegyes valóságú platformok mutatóinak támogatása

Az alábbi táblázat az MRTK gyakori platformjaihoz jellemzően használt mutatók típusait részletezi. MEGJEGYZÉS: Ezekhez a platformokhoz különböző mutatótípusok is felvehetők. Hozzáadhat például egy Mutató mutatót vagy Egy Sphere-mutatót a VR-hoz. Emellett a gamepad vr-eszközei a GGV mutatót is használhatják.

Mutató OpenVR Windows Mixed Reality HoloLens 1 HoloLens 2
ShellHandRayPointer Érvényes Érvényes Érvényes
TeleportPointer Érvényes Érvényes
GGVPointer Érvényes
SpherePointer Érvényes
MertiPointer Érvényes

Mutatók interakciói kóddal

Mutató eseményillesztők

Azok a MonoBehaviour-k, amelyek az alábbi felületek közül egyet vagy többet implementálnak, és egy GameObjecthez vannak rendelve egy -sel, a kapcsolódó felület által meghatározott mutatók interakciós Collider eseményeit kapják meg.

Esemény Description Kezelő
A fókusz megváltozás előtti / Fókusz módosult Mind a játékobjektumra, mind a fókusz elvesztésére, mind pedig arra, amikor egy mutató fókuszra változik. IMixedRealityFocusChangedHandler
Fókusz – Enter/Kilépés A játékobjektumra fókuszálva jelenik meg, amikor az első mutatót beírja, és amikor az utolsó mutató kilép, akkor elveszíti a fókuszt. IMixedRealityFocusHandler
Mutató lefelé / Húzva / Fel / Kattintás Jelentésmutatóra emelve nyomja le, húzza és engedje el. IMixedRealityPointerHandler
Érintés elindítva / Frissítve / Befejezve Érintést támpontos mutatók emelnek ki, például PokePointer érintési tevékenységet jelent. IMixedRealityTouchHandler

Megjegyzés

IMixedRealityFocusChangedHandler A és a objektumokban kell kezelni IMixedRealityFocusHandler őket, amelyeken fel vannak emelve. A fókuszesemények fogadása globálisan lehetséges, de a többi bemeneti eseménytől eltérően a globális eseménykezelő nem blokkolja a fókuszon alapuló események fogadását (az eseményt a globális kezelő és a megfelelő objektum is fogadja).

A mutató bemeneti eseményeinek használata

A mutatóbemeneti eseményeket az MRTK bemeneti rendszere a szokásos bemeneti eseményekhez hasonlóan ismeri fel és kezeli. A különbség az, hogy a mutató bemeneti eseményeit csak a GameObject kezeli fókuszban a bemeneti eseményt elbocsátó mutató, valamint a globális bemenetkezelők. A normál bemeneti eseményeket a GameObjects kezeli az összes aktív mutató fókuszában.

  1. Az MRTK bemeneti rendszere felismeri, hogy bemenő esemény történt
  2. Az MRTK bemeneti rendszer az összes regisztrált globális bemeneti kezelőhöz behozta a bemeneti eseményhez szükséges interfészfunkter-függvényt
  3. A bemeneti rendszer határozza meg, hogy melyik GameObject van fókuszban az eseményt elbocsátó mutatóra
    1. A bemeneti rendszer a Unity Event System-ét használja a releváns felületi függvény a célzott GameObject összes egyező összetevőjéhez
    2. Ha egy bemeneti esemény bármikor használtként van megjelölve, a folyamat véget ér, és nem kap visszahívásokat a GameObjectstől.
      • Példa: A felületet végrehajtó összetevők egy GameObject-nyereséget keresnek, vagy IMixedRealityFocusHandler elveszítik a fókuszt
      • Megjegyzés: A Unity Event System buborékban keres a szülő GameObjectben, ha nem található a kívánt felületnek megfelelő összetevő az aktuális GameObjectben.
  4. Ha nincs regisztrálva globális bemeneti kezelő, és nem található GameObject egyező összetevővel/felülettel, akkor a bemeneti rendszer minden tartalék regisztrált bemeneti kezelőt meg fog hívni

Példa

Az alábbi példaszkprogram módosítja a csatolt renderelő színét, amikor egy mutató fókuszt vesz vagy elhagy, vagy amikor egy mutató kijelöli az objektumot.

public class ColorTap : MonoBehaviour, IMixedRealityFocusHandler, IMixedRealityPointerHandler
{
    private Color color_IdleState = Color.cyan;
    private Color color_OnHover = Color.white;
    private Color color_OnSelect = Color.blue;
    private Material material;

    private void Awake()
    {
        material = GetComponent<Renderer>().material;
    }

    void IMixedRealityFocusHandler.OnFocusEnter(FocusEventData eventData)
    {
        material.color = color_OnHover;
    }

    void IMixedRealityFocusHandler.OnFocusExit(FocusEventData eventData)
    {
        material.color = color_IdleState;
    }

    void IMixedRealityPointerHandler.OnPointerDown(
         MixedRealityPointerEventData eventData) { }

    void IMixedRealityPointerHandler.OnPointerDragged(
         MixedRealityPointerEventData eventData) { }

    void IMixedRealityPointerHandler.OnPointerClicked(MixedRealityPointerEventData eventData)
    {
        material.color = color_OnSelect;
    }
}

Lekérdezési mutatók

Az összes aktuálisan aktív mutatót össze lehet gyűjteni az elérhető bemeneti források (azaz a vezérlők és a rendelkezésre álló bemenetek) hurkolása révén annak kiderítése érdekében, hogy mely mutatók vannak hozzájuk csatolva.

var pointers = new HashSet<IMixedRealityPointer>();

// Find all valid pointers
foreach (var inputSource in CoreServices.InputSystem.DetectedInputSources)
{
    foreach (var pointer in inputSource.Pointers)
    {
        if (pointer.IsInteractionEnabled && !pointers.Contains(pointer))
        {
            pointers.Add(pointer);
        }
    }
}

Elsődleges mutató

A fejlesztők előfizetnek a FocusProviders PrimaryPointerChanged eseményre, és értesítést kaphatnak arról, ha megváltozott a fókuszban látható elsődleges mutató. Ez rendkívül hasznos lehet annak azonosításához, hogy a felhasználó tekintete, egy kézi sugár vagy más bemeneti forrás segítségével kommunikál-e a jelenettel.

private void OnEnable()
{
    var focusProvider = CoreServices.InputSystem?.FocusProvider;
    focusProvider?.SubscribeToPrimaryPointerChanged(OnPrimaryPointerChanged, true);
}

private void OnPrimaryPointerChanged(IMixedRealityPointer oldPointer, IMixedRealityPointer newPointer)
{
    ...
}

private void OnDisable()
{
    var focusProvider = CoreServices.InputSystem?.FocusProvider;
    focusProvider?.UnsubscribeFromPrimaryPointerChanged(OnPrimaryPointerChanged);

    // This flushes out the current primary pointer
    OnPrimaryPointerChanged(null, null);
}

Az PrimaryPointerExample (Assets/MRTK/Examples/Demos/Input/Scenes/PrimaryPointer) jelenet bemutatja, hogyan használható az eseményekhez egy új elsődleges PrimaryPointerChangedHandler mutatóra való válaszadáshoz.

Példa elsődleges mutatóra

Mutató eredménye

A pointer tulajdonság tartalmazza a jelenetlekérdezés aktuális eredményét, amely a fókuszban lévő Result objektum meghatározásához használt. A sugárcímzési mutatóhoz, például a mozgásvezérlőkhöz, a bemenetre és a kézi sugárakhoz alapértelmezés szerint létrehozottakhoz, a sugárcímzési találat helyét és normál helyét fogja tartalmazni.

private void IMixedRealityPointerHandler.OnPointerClicked(MixedRealityPointerEventData eventData)
{
    var result = eventData.Pointer.Result;
    var spawnPosition = result.Details.Point;
    var spawnRotation = Quaternion.LookRotation(result.Details.Normal);
    Instantiate(MyPrefab, spawnPosition, spawnRotation);
}

A PointerResultExample jelenet (Assets/MRTK/Examples/Demos/Input/Scenes/PointerResult/PointerResultExample.unity) bemutatja, hogyan lehet a mutatóval egy objektumot kiíratni Result a találati helyen.

Mutató eredménye

Mutatók letiltása

A mutatók engedélyezéséhez és letiltásához (például a kéz sugár letiltásához) állítsa be az adott mutatótípushoz PointerBehavior a következőt: PointerUtils .

// Disable the hand rays
PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOff);

// Disable hand rays for the right hand only
PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOff, Handedness.Right);

// Disable the gaze pointer
PointerUtils.SetGazePointerBehavior(PointerBehavior.AlwaysOff);

// Set the behavior to match HoloLens 1
// Note, if on HoloLens 2, you must configure your pointer profile to make the GGV pointer show up for articulated hands.
public void SetHoloLens1()
{
    PointerUtils.SetPokePointerBehavior(PointerBehavior.AlwaysOff, Handedness.Any);
    PointerUtils.SetGrabPointerBehavior(PointerBehavior.AlwaysOff, Handedness.Any);
    PointerUtils.SetRayPointerBehavior(PointerBehavior.AlwaysOff, Handedness.Any);
    PointerUtils.SetGGVBehavior(PointerBehavior.Default);
}

További PointerUtilsTurnPointersOnOff példák: és .

Mutató-interakciók szerkesztőn keresztül

A által kezelt mutatóesemények számára az MRTK további kényelmi funkciókat biztosít az összetevő formájában, amely lehetővé teszi a mutatóesemények közvetlen IMixedRealityPointerHandlerPointerHandler kezelését a Unity-eseményeken keresztül.

Mutatókezelő

Mutató kiterjedése

A távoli mutatók olyan beállításokkal is vannak, amelyek korlátozzák, hogy milyen távol lesznek a jelenetben lévő többi objektummal való interakcióhoz. Alapértelmezés szerint ez az érték 10 méterre van beállítva. Ez az érték úgy lett kiválasztva, hogy konzisztens maradjon a HoloLens rendszerhéj működésével.

Ez az előregyártott összetevő mezőinek frissítésével DefaultControllerPointerShellHandRayPointer módosítható:

Mutató kiterjedése – Ez határozza meg azt a maximális távolságot, amely mellett a mutatók interakcióba lépnek.

Alapértelmezett mutató kiterjedése – Ez szabályozza a mutató sugárának/vonalának hosszát, amely akkor jelenik meg, ha a mutató nem lép interakcióba semmivel.

Lásd még