Bemeneti események – MRTK2

Az alábbi lista az egyéni MonoBehaviour-összetevő által implementálandó összes bemeneti eseményillesztőt ismerteti. Ezeket az interfészeket az MRTK bemeneti rendszere hívja meg a felhasználói beviteli interakciókon alapuló egyéni alkalmazáslogika kezeléséhez. A mutatóbemeneti események kezelése kissé eltér az alábbi szokásos bemeneti eseménytípusoktól.

Fontos

Alapértelmezés szerint a szkriptek csak akkor kapnak bemeneti eseményeket, ha a fókuszban lévő GameObject a fókuszban lévő GameObject mutatója vagy szülője.

Kezelő esemény Description
IMixedRealitySourceStateHandler Forrás észlelve/elveszett A bemeneti forrás észlelésekor/elvesztésekor keletkezik, például amikor egy csuklós leosztást észlelnek vagy elvesznek a nyomuk.
IMixedRealitySourcePoseHandler A forrás póz módosult A forrásváltozások alapján emelt érték. A forrás póz a bemeneti forrás általános pózát jelöli. Az adott pózok, például a hat DOF-vezérlőben lévő markolat vagy mutató póz a használatával IMixedRealityInputHandler<MixedRealityPose>szerezhetők be.
IMixedRealityInputHandler Bemenet lefelé/felfelé A bináris bemenetek, például a gombok módosításaira emelve.
IMixedRealityInputHandler<T> Bemenet módosítva Az adott típusú bemenetek módosításaira emelve. A T a következő értékeket veheti fel:
- float (pl. analóg triggert ad vissza)
- Vector2 (pl. visszaadja a gamepad hüvelykujj irányát)
- Vector3 (pl. a nyomon követett eszköz visszatérési pozíciója)
- Quaternion (például a követett eszköz tájolását adja vissza)
- MixedRealityPose (például teljes mértékben nyomon követett eszközt ad vissza)
IMixedRealitySpeechHandler Beszéd kulcsszó felismerve A Speech Commands-profilban konfigurált kulcsszavak egyikének felismerése alapján emelték ki.
IMixedRealityDictationHandler Diktálás
Hipotézis
Eredmény
Kész
Hiba
A diktálási rendszerek a diktálási munkamenet eredményeinek jelentésére emelik.
IMixedRealityGestureHandler Kézmozdulatesemények a következőn:
Első lépések
Frissítve
Befejeződött
Megszakítva
Kézmozdulat-észlelés esetén emelve.
IMixedRealityGestureHandler<T> Kézmozdulat frissítve/befejezve Az adott típusú további adatokat tartalmazó kézmozdulatok észlelésekor aktiválódott. A T lehetséges értékeivel kapcsolatos részletekért tekintse meg a kézmozdulateseményeket.
IMixedRealityHandJointHandler Kéz ízületek frissítve Csuklós kézi vezérlők emelik a kézkötések frissítésekor.
IMixedRealityHandMeshHandler Hand Mesh frissítve A kézi háló frissítésekor a csuklós kézi vezérlők emelik ki.
IMixedRealityInputActionHandler Művelet elindítva/befejezve A művelet kezdetét és végét jelző emelés a műveletekhez hozzárendelt bemenetek esetében.

Bemeneti események működés közben

A szkript szintjén a bemeneti események a fenti táblázatban látható eseménykezelő felületek egyikének implementálásával használhatók. Ha egy bemeneti esemény felhasználói interakción keresztül aktiválódik, a következők történnek:

  1. Az MRTK bemeneti rendszer felismeri, hogy bemeneti esemény történt.
  2. Az MRTK bemeneti rendszer aktiválja a bemeneti esemény megfelelő interfészfüggvényét az összes regisztrált globális bemeneti kezelő számára
  3. A bemeneti rendszerben regisztrált összes aktív mutató esetében:
    1. A bemeneti rendszer határozza meg, hogy melyik GameObject van a fókuszban az aktuális mutatóhoz.
    2. A bemeneti rendszer a Unity eseményrendszerével aktiválja a megfelelő interfészfüggvényt a szűrt GameObject összes egyező összetevőjéhez.
    3. Ha egy bemeneti eseményt használtként jelölt meg, a folyamat véget ér, és további GameObjects-események nem kapnak visszahívásokat.
      • Példa: A rendszer a beszédparancsok felismerésekor megkeresi a felületet IMixedRealitySpeechHandler megvalósító összetevőket.
      • Megjegyzés: A Unity eseményrendszer felborul a szülő GameObject kereséséhez, ha nem találhatók a kívánt felületnek megfelelő összetevők az aktuális GameObjecten.
  4. Ha nincs regisztrálva globális bemeneti kezelő, és nem található GameObject egyező összetevővel/felülettel, akkor a bemeneti rendszer meghívja az egyes tartalék regisztrált bemeneti kezelőket

Megjegyzés

A mutatóbemeneti események kezelése kissé eltér a fent felsorolt bemeneti eseményillesztőkétől. A mutatóbemeneti eseményeket különösen a fókuszban lévő GameObject kezeli a bemeneti eseményt aktiváló mutatóval , valamint a globális beviteli kezelőkkel. A rendszeres beviteli eseményeket a Fókuszban lévő GameObjects kezeli az összes aktív mutató esetében.

Példa bemeneti eseményillesztőre

Az alábbi kód bemutatja a IMixedRealitySpeechHandler felület használatát. Amikor a felhasználó a "kisebb" vagy a "nagyobb" szavakat mondja, miközben a GameObjectre összpontosít ezzel az ShowHideSpeechHandler osztálysal, a GameObject felére vagy kétszer annyira skálázza magát.

public class ShowHideSpeechHandler : MonoBehaviour, IMixedRealitySpeechHandler
{
    ...

    void IMixedRealitySpeechHandler.OnSpeechKeywordRecognized(SpeechEventData eventData)
    {
        if (eventData.Command.Keyword == "smaller")
        {
            transform.localScale *= 0.5f;
        }
        else if (eventData.Command.Keyword == "bigger")
        {
            transform.localScale *= 2.0f;
        }
    }
}

Megjegyzés

IMixedRealitySpeechHandler a bemeneti események megkövetelik, hogy a kívánt kulcsszavak előre regisztrálva legyenek az MRTK Speech Commands-profilban.

Regisztrálás globális bemeneti eseményekre

Ahhoz, hogy olyan összetevőt hozzon létre, amely figyeli a globális bemeneti eseményeket, figyelmen kívül hagyva a GameObject fókuszát, az összetevőnek regisztrálnia kell magát a beviteli rendszerben. A regisztrációt követően a MonoBehaviour bármely példánya bemeneti eseményeket fog kapni, valamint a jelenleg fókuszban lévő GameObject(ek)et és más globális regisztrált figyelőket.

Ha egy bemeneti eseményt használtként jelölt meg, a globális regisztrált kezelők továbbra is megkapják a visszahívásokat. Az eseményt azonban egyetlen célzott GameObjects sem kapja meg.

Példa globális beviteli regisztrációra

public class GlobalHandListenerExample : MonoBehaviour,
    IMixedRealitySourceStateHandler, // Handle source detected and lost
    IMixedRealityHandJointHandler // handle joint position updates for hands
{
    private void OnEnable()
    {
        // Instruct Input System that we would like to receive all input events of type
        // IMixedRealitySourceStateHandler and IMixedRealityHandJointHandler
        CoreServices.InputSystem?.RegisterHandler<IMixedRealitySourceStateHandler>(this);
        CoreServices.InputSystem?.RegisterHandler<IMixedRealityHandJointHandler>(this);
    }

    private void OnDisable()
    {
        // This component is being destroyed
        // Instruct the Input System to disregard us for input event handling
        CoreServices.InputSystem?.UnregisterHandler<IMixedRealitySourceStateHandler>(this);
        CoreServices.InputSystem?.UnregisterHandler<IMixedRealityHandJointHandler>(this);
    }

    // IMixedRealitySourceStateHandler interface
    public void OnSourceDetected(SourceStateEventData eventData)
    {
        var hand = eventData.Controller as IMixedRealityHand;

        // Only react to articulated hand input sources
        if (hand != null)
        {
            Debug.Log("Source detected: " + hand.ControllerHandedness);
        }
    }

    public void OnSourceLost(SourceStateEventData eventData)
    {
        var hand = eventData.Controller as IMixedRealityHand;

        // Only react to articulated hand input sources
        if (hand != null)
        {
            Debug.Log("Source lost: " + hand.ControllerHandedness);
        }
    }

    public void OnHandJointsUpdated(
                InputEventData<IDictionary<TrackedHandJoint, MixedRealityPose>> eventData)
    {
        MixedRealityPose palmPose;
        if (eventData.InputData.TryGetValue(TrackedHandJoint.Palm, out palmPose))
        {
            Debug.Log("Hand Joint Palm Updated: " + palmPose.Position);
        }
    }
}

Regisztráció tartalék bemeneti eseményekre

A tartalék bemeneti kezelők hasonlóak a regisztrált globális bemeneti kezelőkhöz, de a bemeneti események kezelésének végső módjaként kezelik őket. A tartalék bemeneti kezelők csak akkor lesznek kihasználva, ha nem találhatók globális bemeneti kezelők, és nincsenek gameObjects fókuszban.

Példa tartalék bemeneti kezelőre

public class GlobalHandListenerExample : MonoBehaviour,
    IMixedRealitySourceStateHandler // Handle source detected and lost
{
    private void OnEnable()
    {
        CoreServices.InputSystem?.PushFallbackInputHandler(this);
    }

    private void OnDisable()
    {
        CoreServices.InputSystem?.PopFallbackInputHandler();
    }

    // IMixedRealitySourceStateHandler interface
    public void OnSourceDetected(SourceStateEventData eventData)
    {
        ...
    }

    public void OnSourceLost(SourceStateEventData eventData)
    {
        ...
    }
}

Bemeneti események leállítása

Minden bemeneti eseményillesztő egy adatobjektumot biztosít BaseInputEventData paraméterként az interfész minden egyes függvényéhez. Ez az eseményadat-objektum a Unity saját AbstractEventDataobjektumából terjed ki.

Annak érdekében, hogy egy bemeneti esemény ne propagálja a végrehajtást a tagolt módon, egy összetevő meghívhatja AbstractEventData.Use() az eseményt a használtként való megjelöléshez. Ez megakadályozza, hogy minden más GameObjects megkapja az aktuális bemeneti eseményt, a globális bemeneti kezelők kivételével.

Megjegyzés

A metódust meghívó Use() összetevő megakadályozza, hogy más GameObjects megkapja azt. Az aktuális GameObject egyéb összetevői azonban továbbra is megkapják a bemeneti eseményt, és aktiválják a kapcsolódó felületi függvényeket.

Lásd még