Bemeneti események

Az alábbi lista az egyéni MonoBehaviour összetevő által megvalósítható összes elérhető bemeneti eseményillesztőt ismerteti. Ezeket a felületeket az MRTK bemeneti rendszere fogja meghívni, hogy a felhasználói beviteli interakciók alapján kezelje az egyéni alkalmazáslogikát. A mutatóbemeneti események kezelése némileg eltér az alábbi standard bemeneti eseménytípusoktól.

Fontos

Alapértelmezés szerint a szkript csak akkor fogad bemeneti eseményeket, ha az a GameObject fókuszban van egy fókuszban lévő GameObject mutatója vagy szülője alapján.

Kezelő Események Description
IMixedRealitySourceStateHandler Észlelt forrás / Elveszett Egy bemeneti forrás észlelésekor/elveszésekor áll elő, például amikor a rendszer egy kéz észlelését vagy nyomon követését észleli.
IMixedRealitySourcePoseHandler A forrás pozíciója megváltozott A forrás pozícióváltozása esetén emelve. A forrás pozíció a bemeneti forrás általános pozícióját jelöli. Bizonyos testtartások, például a hat DOF-vezérlőben található nyíltartás, a használatával szerezhetők IMixedRealityInputHandler<MixedRealityPose> be.
IMixedRealityInputHandler Bemenet lefelé/felfelé A bináris bemenetek( például gombok) módosításaira emelve.
IMixedRealityInputHandler<T> A bemenet megváltozott Az adott típusú bemenetek módosításaira adva. A T a következő értékeket használhatja:
- - (például egy hasonlatos eseményindítót ad vissza)
- - (például a gamepad ujjlenyomatának irányát adja vissza)
- - (például a nyomon követhető eszköz visszatérési pozíciója)
- - (például a nyomon követett eszköz tájolását adja vissza)
- - (például teljes nyomon követéses eszközt ad vissza)
IMixedRealitySpeechHandler Felismert beszédszavas A Speech Commands-profilban konfigurált kulcsszavak egyikének felismerése alapján.
IMixedRealityDictationHandler Diktálás
Hipotézis
Eredmény
Kész
Hiba
A diktálás rendszerei által a diktálás eredményeinek jelentésére.
IMixedRealityGestureHandler Kézmozdulatok eseményei a következőn:
Első lépések
Frissítve
Befejeződött
Megszakítva
Kézmozdulatészlelésre emelve.
IMixedRealityGestureHandler<T> Kézmozdulat frissítve /befejezve Az adott típusú további adatokat tartalmazó kézmozdulatok észlelése esetén. A T lehetséges értékeiről a kézmozdulati eseményeket tartalmazó oldalon talál további információt.
IMixedRealityHandJointHandler Kézi kéz frissítve A kézzel készített vezérlők emelik ki, ha a kézcsomóék frissülnek.
IMixedRealityHandMeshHandler A Hand Mesh frissítve A kézcsomóponti vezérlők emelik ki a kézi hálók frissítésekor.
IMixedRealityInputActionHandler Művelet elindítva / Véget ért A Műveletekre leképezett bemenetek műveletének kezdő és záró jelzése a Raise (Felemelés) érték.

Bemeneti események a műveletben

A szkript szintjén a bemeneti események a fenti táblázatban látható eseménykezelő felületek egyikének megvalósításával használhatja fel. Amikor egy bemeneti esemény felhasználói interakción keresztül lép fel, a következő történik:

  1. Az MRTK bemeneti rendszer felismeri, hogy bemenő esemény történt.
  2. Az MRTK bemeneti rendszer az összes regisztrált globális bemenetkezelő számára a bemeneti esemény megfelelő interfész funkcióját adja vissza
  3. A bemeneti rendszerben regisztrált összes aktív mutató esetén:
    1. A bemeneti rendszer határozza meg, hogy melyik GameObject van fókuszban az aktuális mutatóhoz.
    2. A bemeneti rendszer a Unity eseményrendszerét használja a releváns felületi függvény a célzott GameObject összes egyező összetevőjéhez.
    3. Ha egy bemeneti esemény bármikor használtként lett megjelölve, a folyamat véget ér, és a GameObjects nem kap visszahívásokat.
      • Példa: Az interfészt végrehajtó összetevőket a rendszer a beszédparancs felismerésekor IMixedRealitySpeechHandler keresi meg.
      • Megjegyzés: A Unity eseményrendszer felbuborg, és megkeresi a szülő GameObjectet, ha az aktuális GameObjecten nem található a kívánt felületnek megfelelő összetevő.
  4. Ha nincs regisztrálva globális beviteli kezelő, és nem található GameObject egyező összetevővel/felülettel, akkor a bemeneti rendszer minden tartalékként regisztrált bemeneti kezelőt meg fog hívni

Megjegyzés

A mutató bemeneti eseményei a fent felsorolt bemeneti eseményillesztőktől kissé eltérő módon vannak kezelve. A mutató bemeneti eseményeit csak a GameObject kezeli fókuszban a bemeneti eseményt elbocsátó mutató , valamint a globális bemeneti kezelők. A normál bemeneti eseményeket a GameObjects kezeli fókuszban az összes aktív mutatóhoz.

Példa bemeneti esemény felületére

Az alábbi kód a felület használatát IMixedRealitySpeechHandler mutatja be. Ha a felhasználó a "kisebb" vagy a "nagyobb" szavakat mondja, miközben egy GameObjectre összpontosít ezzel az osztálysal, a GameObject fel- vagy kétszer annyival ShowHideSpeechHandler skálázódik fel.

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

IMixedRealitySpeechHandlerA bemeneti események megkövetelik, hogy a kívánt kulcsszavak előre regisztrálva vannak az IMixedRealitySpeechHandler

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

Ha olyan összetevőt hoz létre, amely globális bemeneti eseményeket figyel, és figyelmen kívül hagyja, hogy melyik GameObject van a fókuszban, az összetevőnek regisztrálnia kell magát az Input Systemben. A regisztráció után a MonoBehaviour bármely példánya megkapja a bemeneti eseményeket, valamint az aktuálisan fókuszban lévő GameObject(ök)et és a globálisan regisztrált egyéb figyelőket.

Ha egy bemeneti esemény már meg van jelölve használtként,a globálisan regisztrált kezelők továbbra is megkapják a visszahívásokat. Az eseményt azonban egyetlen célzott GameObject sem fogja megkapni.

Példa globális bemenet 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álás tartalék bemeneti eseményekre

A tartalék bemeneti kezelők hasonlóak a regisztrált globális bemenetkezelőkéhez, de a bemeneti események kezelésének utolsó lehetőségének ként vannak kezelve. A tartalék bemeneti kezelők csak akkor lesznek kihasználva, ha nem találhatók globális beviteli kezelők, és nincsenek a GameObjects fókuszban.

Példa tartalék bemenetkezelő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ényfelület egy adatobjektumot biztosít paraméterként az interfész BaseInputEventData minden függvényéhez. Ez az eseményadat-objektum a Unity saját objektumára terjed AbstractEventData ki.

Annak érdekében, hogy a bemeneti esemény ne propagálható a végrehajtáson keresztül a leírt szerint,az összetevő a hívását is használhatja az esemény megjelöléséhez. Ez a globális beviteli kezelők kivételével leállítja, hogy a többi GameObject megkapja az aktuális bemeneti eseményt.

Megjegyzés

A metódust Use() behívó összetevő leállítja, hogy más GameObjects megkapja azt. Az aktuális GameObject más összetevői azonban továbbra is megkapják a bemeneti eseményt, és a kapcsolódó felületi funkciókat is ki fogják oltani.

Lásd még