Invoergebeurtenissen

De onderstaande lijst bevat een overzicht van alle beschikbare interfaces voor invoergebeurtenissen die moeten worden geïmplementeerd door een aangepast MonoBehaviour-onderdeel. Deze interfaces worden aangeroepen door het MRTK-invoersysteem om aangepaste app-logica te verwerken op basis van interacties met gebruikersinvoer. Invoergebeurtenissen van aanwijzers worden iets anders verwerkt dan de onderstaande standaardinvoergebeurtenistypen.

Belangrijk

Standaard ontvangt een script alleen invoergebeurtenissen als dit het GameObject is dat is gericht door een aanwijzer of bovenliggend object in focus.

Handler Gebeurtenissen Description
IMixedRealitySourceStateHandler Bron gedetecteerd/verloren Wordt aangetroffen wanneer een invoerbron wordt gedetecteerd/verloren, bijvoorbeeld wanneer een verwoorde hand wordt gedetecteerd of niet meer kan worden gevonden.
IMixedRealitySourcePoseHandler Bronhouding gewijzigd Verhoogd bij bronhoudingswijzigingen. De bronhouding vertegenwoordigt de algemene houding van de invoerbron. Specifieke houdingen, zoals de handgrepen of aanwijzer in een zes DOF-controller, kunnen worden verkregen via IMixedRealityInputHandler<MixedRealityPose> .
IMixedRealityInputHandler Invoer omlaag/omhoog Dit wordt aan de orde gesteld bij wijzigingen in binaire invoer, zoals knoppen.
IMixedRealityInputHandler<T> Invoer gewijzigd Over wijzigingen in invoer van het opgegeven type. T kan de volgende waarden hebben:
- float (retourneert bijvoorbeeld een analog-trigger)
- Vector2 (retourneert bijvoorbeeld de richting van de gamepadvingerafdruk)
- Vector3 (bijvoorbeeld de retourpositie van het bij te houden apparaat)
- Quaternion (retourneert bijvoorbeeld de richting van het bijgespoorde apparaat)
- MixedRealityPose (retourneert bijvoorbeeld een volledig bij te houden apparaat)
IMixedRealitySpeechHandler Herkend spraaktrefwoord Herkenning van een van de trefwoorden die zijn geconfigureerd in het profiel voor spraakopdrachten.
IMixedRealityDictationHandler Dicteren
Hypothese
Resultaat
Voltooid
Fout
Veroorzaakt door dicteersystemen om de resultaten van een dicteersessie te rapporteren.
IMixedRealityGestureHandler Bewegingsgebeurtenissen op:
Gestart
Bijgewerkt
Voltooid
Geannuleerd
Verhoogd bij bewegingsdetectie.
IMixedRealityGestureHandler<T> Beweging bijgewerkt/voltooid Verhoogd bij de detectie van gebaren met aanvullende gegevens van het opgegeven type. Zie bewegingsgebeurtenissen voor meer informatie over mogelijke waarden voor T.
IMixedRealityHandJointHandler HandGeün bijgewerkt Verhoogd door verwoorde handcontrollers wanneer handmechanismen worden bijgewerkt.
IMixedRealityHandMeshHandler Hand Mesh bijgewerkt Wordt verhoogd door verwoorde handcontrollers wanneer een hand-mesh wordt bijgewerkt.
IMixedRealityInputActionHandler Actie gestart/beëindigd Verhogen om het begin en einde van de actie aan te geven voor invoer die is toe te wijzen aan acties.

Invoergebeurtenissen in actie

Op scriptniveau kunnen invoergebeurtenissen worden gebruikt door een van de gebeurtenis-handlerinterfaces te implementeren die in de bovenstaande tabel worden weergegeven. Wanneer een invoergebeurtenis wordt gegeven via een gebruikersinteractie, vindt het volgende plaats:

  1. Het MRTK-invoersysteem herkent dat er een invoergebeurtenis is opgetreden.
  2. Het MRTK-invoersysteem zorgt dat de relevante interfacefunctie van de invoergebeurtenis wordt gebruikt voor alle geregistreerde globale invoer-handlers
  3. Voor elke actieve aanwijzer die is geregistreerd bij het invoersysteem:
    1. Het invoersysteem bepaalt welk GameObject de focus heeft voor de huidige aanwijzer.
    2. Het invoersysteem maakt gebruik van het gebeurtenissysteem van Unity om de relevante interfacefunctie voor alle overeenkomende onderdelen op het betreffende GameObject te gebruiken.
    3. Als op een bepaald moment een invoergebeurtenis isgemarkeerd als gebruikt, wordt het proces beëindigen en worden er geen verdere GameObjects callbacks ontvangen.
      • Voorbeeld: Er wordt gezocht naar onderdelen die de interface implementeren IMixedRealitySpeechHandler wanneer een spraakopdracht wordt herkend.
      • Opmerking: het Unity-gebeurtenissysteem gaat bellen om het bovenliggende GameObject te doorzoeken als er geen onderdelen zijn gevonden die overeenkomen met de gewenste interface op het huidige GameObject.
  4. Als er geen globale invoer-handlers zijn geregistreerd en er geen GameObject wordt gevonden met een overeenkomende component/interface, roept het invoersysteem elke geregistreerde terugvalinvoer-handler aan

Notitie

Invoergebeurtenissen van aanwijzers worden op een iets andere manier verwerkt dan de hierboven vermelde invoergebeurtenisinterfaces. Met name invoergebeurtenissen van aanwijzers worden alleen verwerkt door het GameObject in focus door de aanwijzer die de invoergebeurtenis heeft uitgevoerd, evenals globale invoer-handlers. Reguliere invoergebeurtenissen worden verwerkt door GameObjects in focus voor alle actieve aanwijzers.

Voorbeeld van een invoergebeurtenisinterface

In de onderstaande code wordt het gebruik van de IMixedRealitySpeechHandler interface gedemonstreerd. Wanneer de gebruiker de woorden 'kleiner' of 'groter' zegt terwijl de focus op een GameObject met deze klasse ligt, wordt het GameObject met de helft of twee keer ShowHideSpeechHandler zo veel geschaald.

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

Notitie

IMixedRealitySpeechHandlerinvoergebeurtenissen vereisen dat de gewenste trefwoorden vooraf zijn geregistreerd in het MRTK-profiel voor spraakopdrachten.

Registreren voor globale invoergebeurtenissen

Als u een onderdeel wilt maken dat luistert naar globale invoergebeurtenissen, moet een onderdeel zichzelf registreren bij het invoersysteem, zonder dat dit de focus heeft op gameobjecten. Na de registratie ontvangen alle exemplaren van deze MonoBehaviour invoergebeurtenissen samen met alle GameObject(s) die zich momenteel in de focus en andere globale geregistreerde listeners.

Als een invoergebeurtenis is gemarkeerd als gebruikt,ontvangen globale geregistreerde handlers nog steeds callbacks. De gebeurtenis wordt echter niet door GameObjects ontvangen.

Voorbeeld van globale invoerregistratie

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

Registreren voor terugvalinvoergebeurtenissen

Terugvalinvoer-handlers zijn vergelijkbaar met geregistreerde globale invoer-handlers, maar worden beschouwd als een laatste redmiddel voor het verwerken van invoergebeurtenissen. Alleen als er geen globale invoer-handlers zijn gevonden en er geen GameObjects zijn gericht, worden terugvalinvoer-handlers gebruikt.

Voorbeeld van een terugvalinvoer-handler

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

Invoergebeurtenissen stoppen

Elke interface voor invoergebeurtenissen biedt BaseInputEventData een gegevensobject als een parameter voor elke functie in de interface. Dit gebeurtenisgegevensobject is een uitbreiding van de eigen van AbstractEventData Unity.

Om te voorkomen dat een invoergebeurtenis wordt doorgegeven via de uitvoering zoals beschreven, kan een onderdeel aanroepen om de gebeurtenis te AbstractEventData.Use() markeren als gebruikt. Hiermee wordt voorkomen dat andere GameObjects de huidige invoergebeurtenis ontvangen, met uitzondering van globale invoer-handlers.

Notitie

Een onderdeel dat de methode Use() aanroept, stopt de ontvangst van andere GameObjects. Andere onderdelen op het huidige GameObject ontvangen echter nog steeds de invoergebeurtenis en zullen eventuele gerelateerde interfacefuncties worden uitgeschakeld.

Zie ook