Sdílet prostřednictvím


Ovladače pohybu v Unity

Existují dva klíčové způsoby, jak na pohled v Unity provádět akce, gesta rukou a ovladače pohybu v HoloLens a Asistivní HMD. K datům pro oba zdroje prostorového vstupu přistupujete prostřednictvím stejných rozhraní API v Unity.

Unity poskytuje dva primární způsoby přístupu k prostorovými vstupními daty pro Windows Mixed Reality. Běžná rozhraní API Input.GetButton/Input.GetAxis fungují napříč několika sadami SDK Unity XR, zatímco rozhraní API InteractionManager/GestureRecognizer specifické pro Windows Mixed Reality zveřejňuje úplnou sadu prostorových vstupních dat.

Vstupní rozhraní API Unity XR

Pro nové projekty doporučujeme používat nová vstupní rozhraní API XR od začátku.

Další informace o rozhraních API XR najdete tady.

Tabulka mapování tlačítek/osy Unity

Správce vstupu Unity pro ovladače pohybu Windows Mixed Reality podporuje ID tlačítek a os uvedených níže prostřednictvím rozhraní API Input.GetButton/GetAxis . Sloupec Specifická pro Windows odkazuje na vlastnosti dostupné mimo typ InteractionSourceState . Každé z těchto rozhraní API je podrobně popsáno v následujících částech.

Mapování ID tlačítka nebo osy pro Windows Mixed Reality obecně odpovídají ID tlačítka nebo osy Oculus.

Mapování ID tlačítka nebo osy pro Windows Mixed Reality se liší od mapování OpenVR dvěma způsoby:

  1. Mapování používá ID touchpadu, která se liší od thumbsticku, aby podporovala ovladače s kryptografickými znaménkami i touchpady.
  2. Mapování zabraňuje přetížení ID tlačítek A a X tlačítek nabídky, aby je nechala k dispozici pro fyzická tlačítka ABXY.
Vstup Běžná rozhraní API Unity
(Input.GetButton/GetAxis)
Vstupní rozhraní API specifické pro windows MR
(XR. WSA. Vstup)
Levotočivý Pravá ruka
Výběr stisknuté aktivační události Osa 9 = 1,0 Osa 10 = 1,0 selectPressed
Výběr analogové hodnoty aktivační události Osa 9 Osa 10 selectPressedAmount
Výběr částečně stisknuté aktivační události Tlačítko 14 (compat gamepadu) Tlačítko 15 (kompat gamepadu) selectPressedAmount > 0.0
Tlačítko nabídky stisknuté Tlačítko 6* Tlačítko 7* menuPressed
Tlačítko úchytu stisknuté Osa 11 = 1,0 (žádné analogové hodnoty)
Tlačítko 4 (kompat gamepadu)
Osa 12 = 1,0 (žádné analogové hodnoty)
Tlačítko 5 (kompat gamepadu)
uchopil
Palec X (vlevo: -1,0, vpravo: 1,0) Osa 1 Osa 4 thumbstickPosition.x
Palec Y (nahoře: -1,0, dole: 1,0) Osa 2 Osa 5 thumbstickPosition.y
Stisknutá kryptografický znaménka Tlačítko 8 Tlačítko 9 thumbstickPressed
Touchpad X (vlevo: -1.0, vpravo: 1,0) Osa 17* Osa 19* touchpadPosition.x
Touchpad Y (nahoře: -1,0, dole: 1,0) Osa 18* Osa 20* touchpadPosition.y
Touchpad touched Tlačítko 18* Tlačítko 19* touchpadTouched
Touchpad stisknuto Tlačítko 16* Tlačítko 17* touchpadPressed
Pozice úchytu 6DoF nebo pozice ukazatele Jen přichycení : XR. InputTracking.GetLocalPosition
XR. InputTracking.GetLocalRotation
Předání úchytu nebo ukazatele jako argumentu: sourceState.sourcePose.TryGetPosition
sourceState.sourcePose.TryGetRotation
Stav sledování Přesnost pozice a riziko ztráty zdroje dostupné pouze prostřednictvím rozhraní API specifického pro mr. sourceState.sourcePose.positionAccuracy
sourceState.properties.sourceLossRisk

Poznámka:

Tato ID tlačítek nebo os se liší od ID, která Unity používá pro OpenVR kvůli kolizím v mapování používaných hernímipady, Oculus Touch a OpenVR.

OpenXR

Základní informace o interakcích hybridní reality v Unity najdete v příručce Unity pro vstup Unity XR. Tato dokumentace Unity popisuje mapování ze vstupů specifických pro kontroler na obecnější InputFeatureUsages, jak lze identifikovat a kategorizovat dostupné vstupy XR, jak číst data z těchto vstupů a další.

Modul plug-in Mixed Reality OpenXR poskytuje další vstupní profily interakce, které jsou namapované na standardní inputFeatureUsages, jak je podrobně popsáno níže:

InputFeatureUsage Ovladač HP Reverb G2 (OpenXR) HoloLens Hand (OpenXR)
primary2DAxis Pákový ovladač
primary2DAxisClick Joystick - Klikněte na
spoušť Trigger
sevření Sevření Vzduchové klepnutí nebo zmáčknutí
primární tlačítko [X/A] - Stiskněte Klepnutí vzduchem
secondaryButton [Y/B] - Stiskněte
gripButton Grip - Stiskněte
triggerButton Aktivační událost – stiskněte
menuButton Nabídka

Pozice gripu vs. bodování pozice

Windows Mixed Reality podporuje ovladače pohybu v různých formách. Návrh každého kontroleru se liší v jeho vztahu mezi polohou ruky uživatele a přirozeným směrem dopředu, který by aplikace měly použít k nasměrování při vykreslování kontroleru.

Chcete-li tyto kontrolery lépe znázorňovat, existují dva druhy pozic, které můžete prozkoumat pro každý zdroj interakce, pozici úchytu a pozici ukazatele. Souřadnice pozice úchytu i ukazatele jsou vyjádřeny všemi rozhraními API Unity v globálních souřadnicích světa Unity.

Pozice úchytu

Pozice úchytu představuje umístění dlaně uživatelů, ať už rozpoznané HoloLensem, nebo držící ovladač pohybu.

Na imerzivních náhlavních soupravách se pozice úchytu nejlépe hodí k vykreslení ruky uživatele nebo objektu uchovávaného v ruce uživatele. Při vizualizaci ovladače pohybu se používá také pozice úchytu. Vykreslovatelný model poskytovaný windows pro ovladač pohybu používá úchyt jako jeho původ a střed otáčení.

Pozice úchytu je definována konkrétně takto:

  • Pozice úchytu: Palm centroid při přirozeném držení kontroleru, nastavil levý nebo pravý střed pozice uvnitř úchytu. Na ovladači pohybu Windows Mixed Reality se tato pozice obecně zarovná s tlačítkem Uchopení.
  • Pravá osa orientace úchytu: Když zcela otevřete ruku, abyste vytvořili plochou 5 prstovou pozici, paprsek, který je normální pro vaši palmu (dopředu od levého dlaně, dozadu z pravého dlaně)
  • Orientace úchytu na osu Vpřed: Když částečně zavřete ruku (jako by se drží kontroler), paprsek, který ukazuje "vpřed" přes trubku tvořenou vašimi netisknutými prsty.
  • Orientace úchytu je osa Nahoru: Osa Nahoru odvozená definicemi Doprava a Vpřed.

K pozici úchytu se dostanete prostřednictvím vstupního rozhraní API pro různé dodavatele Unity (XR). InputTracking. GetLocalPosition/Rotation) nebo prostřednictvím rozhraní API specifického pro mr systému Windows (sourceState.sourcePose.TryGetPosition/Rotation, žádost o zadání dat pro uzel Grip ).

Pozice ukazatele

Pozice ukazatele představuje špičku kontroleru směřujícího vpřed.

Při vykreslování samotného modelu kontroleru se nejlépe používá pozice ukazatele poskytnutého systémem k raycastu. Pokud vykreslujete nějaký jiný virtuální objekt místo kontroleru, jako je virtuální zbraň, měli byste ukazovat na paprsk, který je pro tento virtuální objekt nejpřirozenější, například paprsk, který cestuje podél sudu modelu zbraně definovaného aplikací. Vzhledem k tomu, že uživatelé vidí virtuální objekt a ne fyzický kontroler, bude pro uživatele, kteří používají vaši aplikaci, pravděpodobně přirozeněji odkazovat na virtuální objekt.

V současné době je pozice ukazatele k dispozici v Unity pouze prostřednictvím rozhraní API specifického pro windows MR, sourceState.sourcePose.TryGetPosition/Rotation, které jako argument předává InteractionSourceNode.Pointer .

OpenXR

Přístup ke dvěma sadám pozic máte prostřednictvím vstupních interakcí OpenXR:

  • Pozice úchytu pro vykreslení objektů v ruce
  • Cílem je ukázat na svět.

Další informace o tomto návrhu a rozdíly mezi těmito dvěma pozicemi najdete ve specifikaci OpenXR – vstupních dílčích cest.

Pozice poskytované InputFeatureUsages DevicePosition, DeviceRotation, DeviceVelocity a DeviceAngularVelocity představují pozici úchytu OpenXR. InputFeatureUsages související s pozicemi úchytu jsou definovány v CommonUsages Unity.

Pozice poskytované InputFeatureUsages PointerPosition, PointerRotation, PointerVelocity a PointerAngularVelocity představují pozici Cíle OpenXR. Tyto inputFeatureUsages nejsou definovány v žádných zahrnutých souborech C#, takže budete muset definovat vlastní InputFeatureUsages následujícím způsobem:

public static readonly InputFeatureUsage<Vector3> PointerPosition = new InputFeatureUsage<Vector3>("PointerPosition");

Haptika

Informace o používání haptik ve vstupním systému XR Unity najdete v dokumentaci k ručnímu zadávání Unity pro Unity XR Input - Haptics.

Stav sledování kontroleru

Podobně jako náhlavní soupravy nevyžaduje ovladač pohybu Windows Mixed Reality žádné nastavení externích snímačů sledování. Místo toho jsou kontrolery sledovány senzory v samotné náhlavní soupravě.

Pokud uživatel přesune kontrolery mimo pole zobrazení náhlavní soupravy, windows ve většině případů odvozuje pozice kontroleru. Pokud kontroler ztratil vizuální sledování po dostatečně dlouhou dobu, pozice kontroleru se sníží na přibližnou přesnost.

V tomto okamžiku systém zamkne kontroler uživateli, sleduje pozici uživatele při pohybu, zatímco stále zobrazuje skutečnou orientaci kontroleru pomocí jeho vnitřních snímačů orientace. Mnoho aplikací, které používají kontrolery k nasměrování a aktivaci prvků uživatelského rozhraní, může normálně fungovat, zatímco přibližná přesnost bez toho, aby uživatel hleděl.

Explicitní odůvodnění stavu sledování

Aplikace, které chtějí zacházet s pozicemi odlišně podle stavu sledování, mohou dále procházet a kontrolovat vlastnosti stavu kontroleru, jako je SourceLossRisk a PositionAccuracy:

Stav sledování SourceLossRisk PositionAccuracy TryGetPosition
Vysoká přesnost < 1.0 Vysoko true
Vysoká přesnost (riziko ztráty) == 1,0 Vysoko true
Přibližná přesnost == 1,0 Přibližný true
Žádná pozice == 1,0 Přibližný false (nepravda)

Tyto stavy sledování ovladače pohybu jsou definovány takto:

  • Vysoká přesnost: Zatímco ovladač pohybu je v oblasti zobrazení náhlavní soupravy, bude obecně poskytovat vysoce přesné polohy na základě vizuálního sledování. Pohybující se kontroler, který momentálně opouští pole zobrazení nebo je momentálně zakrytý senzory náhlavní soupravy (např. z druhé ruky uživatele), bude i nadále vracet vysoké přesnosti na krátkou dobu na základě inerciálního sledování samotného kontroleru.
  • Vysoká přesnost (riziko ztráty): Když uživatel přesune ovladač pohybu za okraj pohledu náhlavní soupravy, náhlavní souprava brzy nebude moct vizuálně sledovat polohu ovladače. Aplikace ví, kdy kontroler dosáhl této hranice FOV, zobrazením sourceLossRisk dosáhnout 1.0. V tomto okamžiku se aplikace může rozhodnout pozastavit gesta kontroleru, která vyžadují stabilní proud vysoce kvalitních pozic.
  • Přibližná přesnost: Pokud kontroler ztratil vizuální sledování po dostatečně dlouhou dobu, pozice kontroleru se sníží na přibližnou přesnost. V tomto okamžiku systém zamkne kontroler uživateli, sleduje pozici uživatele při pohybu, zatímco stále zobrazuje skutečnou orientaci kontroleru pomocí jeho vnitřních snímačů orientace. Mnoho aplikací, které používají kontrolery k nasměrování a aktivaci prvků uživatelského rozhraní, může fungovat jako normální, zatímco v přibližné přesnosti bez toho, aby uživatel hleděl. Aplikace s těžšími požadavky na vstup se můžou rozhodnout, že tento pokles z vysoké přesnosti na přibližnou přesnost kontrolou vlastnosti PositionAccuracy například umožní uživateli velkorysejší hitbox na cílech mimo obrazovku během této doby.
  • Žádná pozice: Zatímco kontroler může pracovat s přibližnou přesností po dlouhou dobu, někdy systém ví, že dokonce i pozice uzamčená tělem není v tuto chvíli smysluplná. Například kontroler, který byl zapnutý, nebyl nikdy pozorován vizuálně, nebo uživatel může dát kontroler, který pak vyzvedl někdo jiný. V takových případech systém neposkytne aplikaci žádnou pozici a Funkce TryGetPosition vrátí hodnotu false.

Běžná rozhraní API Unity (Input.GetButton/GetAxis)

Obor názvů: UnityEngine, UnityEngine.XR
Typy: Input, XR. InputTracking

Unity v současné době používá obecná rozhraní API Input.GetButton/Input.GetAxis k zveřejnění vstupu pro sadu Oculus SDK, sady OpenVR SDK a Windows Mixed Reality, včetně ovládacích prvků hands a motion. Pokud vaše aplikace používá tato rozhraní API pro vstup, může snadno podporovat ovladače pohybu napříč několika sadami SDK XR, včetně Windows Mixed Reality.

Získání stavu stisknutého logického tlačítka

Pokud chcete použít obecná vstupní rozhraní API Unity, obvykle začnete propojením tlačítek a os k logickým názvům v Unity Input Manageru, vazbou ID tlačítka nebo osy k jednotlivým názvům. Pak můžete napsat kód, který odkazuje na název logického tlačítka nebo osy.

Pokud chcete například namapovat tlačítko triggeru levého ovladače pohybu na akci Odeslat, přejděte do části Upravit > vstup nastavení > projektu v Unity a rozbalte vlastnosti oddílu Odeslat v části Osy. Změňte vlastnost pozitivního tlačítka nebo alternativní pozitivní tlačítko na tlačítko joystick 14, například takto:

InputManager Unity
Unity InputManager

Váš skript pak může zkontrolovat akci Odeslat pomocí Input.GetButton:

if (Input.GetButton("Submit"))
{
  // ...
}

Další logická tlačítka můžete přidat změnou vlastnosti Velikost v části Osy.

Přímé získání stavu fyzického tlačítka

K tlačítkům můžete přistupovat také ručně pomocí jejich plně kvalifikovaného názvu pomocí Input.GetKey:

if (Input.GetKey("joystick button 8"))
{
  // ...
}

Získání pozice ovladače pohybu nebo ruky

Pomocí XR můžete získat přístup k poloze a otočení kontroleru . InputTracking:

Vector3 leftPosition = InputTracking.GetLocalPosition(XRNode.LeftHand);
Quaternion leftRotation = InputTracking.GetLocalRotation(XRNode.LeftHand);

Poznámka:

Výše uvedený kód představuje pozici úchytu kontroleru (kde uživatel drží kontroler), což je užitečné pro vykreslení meču nebo zbraně v ruce uživatele nebo modelu samotného kontroleru.

Vztah mezi touto úchopnou pozicí a ukazatelem (kde špička kontroleru ukazuje) se může u řadičů lišit. V tuto chvíli je přístup k pozici ukazatele kontroleru možný pouze prostřednictvím vstupního rozhraní API specifického pro MR, které je popsáno v následujících částech.

Rozhraní API specifická pro Windows (XR). WSA. Vstup)

Upozornění

Pokud váš projekt používá některý z XR. Rozhraní WSA API, tato rozhraní jsou postupně ve prospěch sady XR SDK v budoucích verzích Unity. Pro nové projekty doporučujeme od začátku používat sadu XR SDK. Další informace o vstupním systému XR a rozhraních API najdete tady.

Obor názvů: UnityEngine.XR.WSA.Input
Typy: InteractionManager, InteractionSourceState, InteractionSource, InteractionSourceProperties, InteractionSourceKind, InteractionSourceLocation

Pokud chcete získat podrobnější informace o ručním vstupu Windows Mixed Reality (pro HoloLens) a ovladačích pohybu, můžete použít rozhraní API prostorového vstupu specifické pro Windows v oboru názvů UnityEngine.XR.WSA.Input . Díky tomu můžete získat přístup k dalším informacím, jako je přesnost pozice nebo druh zdroje, abyste oddělily ruce a ovladače.

Dotazování stavu rukou a ovladačů pohybu

Pomocí metody GetCurrentReading můžete dotazovat stav tohoto rámce pro každý zdroj interakce (rukou nebo ovladač pohybu).

var interactionSourceStates = InteractionManager.GetCurrentReading();
foreach (var interactionSourceState in interactionSourceStates) {
    // ...
}

Každý InteractionSourceState , který získáte zpět, představuje zdroj interakce v aktuálním okamžiku v čase. InteractionSourceState zveřejňuje například tyto informace:

  • K jakým druhům stisků dochází (Select/Menu/Uchopte/Touchpad/Thumbstick)

    if (interactionSourceState.selectPressed) {
         // ...
    }
    
  • Další data specifická pro ovladače pohybu, jako jsou souřadnice XY touchpadu nebo kryptografického znaménka a dotknutý stav

    if (interactionSourceState.touchpadTouched && interactionSourceState.touchpadPosition.x > 0.5) {
         // ...
    }
    
  • InteractionSourceKind zjistit, jestli je zdrojem ruka nebo ovladač pohybu

    if (interactionSourceState.source.kind == InteractionSourceKind.Hand) {
         // ...
    }
    

Dotazování na předpovězené pozice vykreslování

  • Při dotazování na zdrojová data interakce z rukou a kontrolerů jsou pozice, které získáte, předpovězeny pro okamžik v čase, kdy se fotony tohoto rámce dostanou k očím uživatele. Předpovězené pozice jsou nejvhodnější pro vykreslení kontroleru nebo uchovávaného objektu v každém rámečku. Pokud cílíte na danou tiskovou nebo vydané verzi s kontrolerem, bude to nejpřesnější, pokud použijete historická rozhraní API událostí popsaná níže.

    var sourcePose = interactionSourceState.sourcePose;
    Vector3 sourceGripPosition;
    Quaternion sourceGripRotation;
    if ((sourcePose.TryGetPosition(out sourceGripPosition, InteractionSourceNode.Grip)) &&
         (sourcePose.TryGetRotation(out sourceGripRotation, InteractionSourceNode.Grip))) {
         // ...
    }
    
  • Můžete také získat předpovězenou pozici hlavy pro tento aktuální rámec. Stejně jako u zdrojové pozice je to užitečné pro vykreslení kurzoru, i když cílení na danou tiskovou nebo vydané verzi bude nejpřesnější, pokud použijete historická rozhraní API událostí popsaná níže.

    var headPose = interactionSourceState.headPose;
    var headRay = new Ray(headPose.position, headPose.forward);
    RaycastHit raycastHit;
    if (Physics.Raycast(headPose.position, headPose.forward, out raycastHit, 10)) {
         var cursorPos = raycastHit.point;
         // ...
    }
    

Zpracování zdrojových událostí interakce

Pokud chcete zpracovávat vstupní události tak, jak k nim dochází s přesnými historickými daty, můžete místo dotazování zpracovat zdrojové události interakce.

Zpracování zdrojových událostí interakce:

  • Zaregistrujte se pro vstupní událost InteractionManager . Pro každý typ události interakce, která vás zajímá, je potřeba se přihlásit k odběru.

    InteractionManager.InteractionSourcePressed += InteractionManager_InteractionSourcePressed;
    
  • Zpracujte událost. Jakmile se přihlásíte k odběru události interakce, získáte zpětné volání, pokud je to vhodné. V příkladu SourcePressed to bude po zjištění zdroje a před jeho uvolněním nebo ztrátou.

    void InteractionManager_InteractionSourceDetected(InteractionSourceDetectedEventArgs args)
         var interactionSourceState = args.state;
    
         // args.state has information about:
            // targeting head ray at the time when the event was triggered
            // whether the source is pressed or not
            // properties like position, velocity, source loss risk
            // source id (which hand id for example) and source kind like hand, voice, controller or other
    }
    

Jak zastavit zpracování události

Pokud už událost nezajímáte nebo zničíte objekt, který se přihlásil k odběru události, musíte zastavit zpracování události. Pokud chcete ukončit zpracování události, odhlásíte odběr události.

InteractionManager.InteractionSourcePressed -= InteractionManager_InteractionSourcePressed;

Seznam zdrojových událostí interakce

Dostupné zdrojové události interakce jsou:

  • InteractionSourceDetected (zdroj se aktivuje)
  • InteractionSourceLost (stane se neaktivním)
  • InteractionSourcePressed (klepnutí, stisknutí tlačítka nebo "Vybrat" promluvy)
  • InteractionSourceReleased (konec klepnutí, vydané tlačítko nebo konec "Vybrat" promluvy)
  • InteractionSourceUpdated (přesune nebo jinak změní nějaký stav)

Události pro historické cílení představují nejpřesnější shodu s tiskem nebo vydáním

Rozhraní API pro dotazování popsaná výše poskytují předpovězené pozice vaší aplikace. I když jsou tyto předpovězené pozice nejvhodnější pro vykreslení kontroleru nebo virtuálního kapesního objektu, budoucí pozice nejsou pro cílení optimální, a to ze dvou klíčových důvodů:

  • Když uživatel stiskne tlačítko na ovladači, může být přibližně 20 ms bezdrátové latence přes Bluetooth, než systém přijme stisknutí.
  • Pokud pak používáte předpovězenou pozici, použije se další 10–20 ms dopředu predikce, která bude cílit na čas, kdy se fotony aktuálního rámce dostanou do očí uživatele.

To znamená, že dotazování vám dává zdrojovou pozici nebo pozici hlavy, která je 30-40 ms dopředu, odkud se hlava a ruce uživatele skutečně vrátily při stisknutí nebo uvolnění. U ručního vstupu HoloLensu neexistuje žádné zpoždění bezdrátového přenosu, je podobné zpoždění zpracování, které by zjistilo stisknutí.

Pokud chcete přesně cílit na základě původního záměru uživatele pro ruční nebo kontrolerové stisknutí, měli byste použít historickou zdrojovou pozici nebo hlavní pozici z této vstupní události InteractionSourcePressed nebo InteractionSourceReleased .

Můžete cílit na tisk nebo vydání s historickými údaji z hlavy uživatele nebo jeho kontroleru:

  • Hlava se v okamžiku, kdy došlo k gestu nebo stisknutí ovladače, které se dá použít k cílení na to, na co uživatel nahlížel:

    void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs args) {
         var interactionSourceState = args.state;
         var headPose = interactionSourceState.headPose;
         RaycastHit raycastHit;
         if (Physics.Raycast(headPose.position, headPose.forward, out raycastHit, 10)) {
             var targetObject = raycastHit.collider.gameObject;
             // ...
         }
    }
    
  • Zdroj představuje v okamžiku, kdy došlo k stisknutí ovladače pohybu, který lze použít k určení toho, na co uživatel ukazoval kontroler. Bude to stav kontroleru, který zaznamenal stisknutí. Pokud vykreslujete samotný kontroler, můžete místo pozice úchytu požádat o zobrazení ukazatele, aby zastřelil cílový paprsek od toho, co uživatel považuje za přirozený tip tohoto vykresleného kontroleru:

    void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs args)
    {
         var interactionSourceState = args.state;
         var sourcePose = interactionSourceState.sourcePose;
         Vector3 sourceGripPosition;
         Quaternion sourceGripRotation;
         if ((sourcePose.TryGetPosition(out sourceGripPosition, InteractionSourceNode.Pointer)) &&
             (sourcePose.TryGetRotation(out sourceGripRotation, InteractionSourceNode.Pointer))) {
             RaycastHit raycastHit;
             if (Physics.Raycast(sourceGripPosition, sourceGripRotation * Vector3.forward, out raycastHit, 10)) {
                 var targetObject = raycastHit.collider.gameObject;
                 // ...
             }
         }
    }
    

Příklad obslužných rutin událostí

using UnityEngine.XR.WSA.Input;

void Start()
{
    InteractionManager.InteractionSourceDetected += InteractionManager_InteractionSourceDetected;
    InteractionManager.InteractionSourceLost += InteractionManager_InteractionSourceLost;
    InteractionManager.InteractionSourcePressed += InteractionManager_InteractionSourcePressed;
    InteractionManager.InteractionSourceReleased += InteractionManager_InteractionSourceReleased;
    InteractionManager.InteractionSourceUpdated += InteractionManager_InteractionSourceUpdated;
}

void OnDestroy()
{
    InteractionManager.InteractionSourceDetected -= InteractionManager_InteractionSourceDetected;
    InteractionManager.InteractionSourceLost -= InteractionManager_InteractionSourceLost;
    InteractionManager.InteractionSourcePressed -= InteractionManager_InteractionSourcePressed;
    InteractionManager.InteractionSourceReleased -= InteractionManager_InteractionSourceReleased;
    InteractionManager.InteractionSourceUpdated -= InteractionManager_InteractionSourceUpdated;
}

void InteractionManager_InteractionSourceDetected(InteractionSourceDetectedEventArgs args)
{
    // Source was detected
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourceLost(InteractionSourceLostEventArgs state)
{
    // Source was lost. This will be after a SourceDetected event and no other events for this
    // source id will occur until it is Detected again
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs state)
{
    // Source was pressed. This will be after the source was detected and before it is
    // released or lost
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourceReleased(InteractionSourceReleasedEventArgs state)
{
    // Source was released. The source would have been detected and pressed before this point.
    // This event will not fire if the source is lost
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourceUpdated(InteractionSourceUpdatedEventArgs state)
{
    // Source was updated. The source would have been detected before this point
    // args.state has the current state of the source including id, position, kind, etc.
}

Ovladače pohybu v MRTK

K gestům a ovladači pohybu můžete přistupovat ze správce vstupu.

Řiďte se kurzy

Podrobné kurzy s podrobnějšími příklady přizpůsobení jsou k dispozici v Mixed Reality Academy:

MR Vstup 213 - ovladač pohybu
MR Vstup 213 - ovladač pohybu

Kontrolní bod dalšího vývoje

Pokud sledujete cestu vývoje Unity, kterou jsme vytvořili, jste uprostřed zkoumání základních stavebních bloků MRTK. Odtud můžete pokračovat k dalšímu stavebnímu bloku:

Nebo přejděte na možnosti platformy a rozhraní API hybridní reality:

Kdykoli se můžete vrátit k kontrolním bodům vývoje Unity.

Viz také