Invoer gebeurtenissen — MRTK2

De onderstaande lijst bevat een overzicht van alle beschikbare invoer gebeurtenisinterfaces 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 gebruikersinvoerinteracties. Aanwijzerinvoergebeurtenissen worden iets anders verwerkt dan de standaardinvoergebeurtenistypen hieronder.

Belangrijk

Standaard ontvangt een script alleen invoerevenementen als dit het GameObject is waarin de focus ligt door een aanwijzer of bovenliggend element van een GameObject in focus.

Handler gebeurtenis Beschrijving
IMixedRealitySourceStateHandler Bron gedetecteerd/verloren Opgeheven wanneer een invoerbron wordt gedetecteerd/verloren, bijvoorbeeld wanneer een gelede hand wordt gedetecteerd of het spoor kwijtraakt.
IMixedRealitySourcePoseHandler Bronhouding gewijzigd Verhoogd bij wijzigingen in de bronhouding. De bronhouding vertegenwoordigt de algemene houding van de invoerbron. Specifieke poses, zoals de grip of pointer pose in een zes DOF controller, kunnen worden verkregen via IMixedRealityInputHandler<MixedRealityPose>.
IMixedRealityInputHandler Invoer omlaag/omhoog Gegenereerd bij wijzigingen in binaire invoer, zoals knoppen.
IMixedRealityInputHandler<T> Invoer gewijzigd Gegenereerd over wijzigingen in invoer van het opgegeven type. T kan de volgende waarden aannemen:
- float (retourneert bijvoorbeeld analoge trigger)
- Vector2 (retourneert bijvoorbeeld de richting van de duimstick van de gamepad)
- Vector3 (bijv. retourpositie van bijgehouden apparaat)
- Quaternion (retourneert bijvoorbeeld de richting van het getraceerde apparaat)
- MixedRealityPose (retourneert bijvoorbeeld een volledig bijgehouden apparaat)
IMixedRealitySpeechHandler Spraakwoord herkend Gegenereerd bij de herkenning van een van de trefwoorden die zijn geconfigureerd in het profiel Spraakopdrachten.
IMixedRealityDictationHandler Dicteren
Hypothese
Resultaat
Voltooid
Fout
Gegenereerd door dicteersystemen om de resultaten van een dicteersessie te rapporteren.
IMixedRealityGestureHandler Gebaargebeurtenissen op:
Gestart
Bijgewerkt
Voltooid
Geannuleerd
Verhoogd bij detectie van bewegingen.
IMixedRealityGestureHandler<T> Beweging bijgewerkt/voltooid Gegenereerd bij detectie van bewegingen die aanvullende gegevens van het opgegeven type bevatten. Zie gebarengebeurtenissen voor meer informatie over mogelijke waarden voor T.
IMixedRealityHandJointHandler Handgewrichten bijgewerkt Opgeheven door gelede handregelaars wanneer handgewrichten worden bijgewerkt.
IMixedRealityHandMeshHandler Hand mesh bijgewerkt Opgeheven door gelede handregelaars wanneer een handgaas wordt bijgewerkt.
IMixedRealityInputActionHandler Actie gestart/beëindigd Verhogen om het begin en einde van de actie aan te geven voor invoer die is toegewezen aan acties.

Invoer van gebeurtenissen in actie

Op scriptniveau kunnen invoer gebeurtenissen worden gebruikt door een van de gebeurtenis-handler-interfaces te implementeren die in de bovenstaande tabel worden weergegeven. Wanneer een invoer gebeurtenis wordt geactiveerd via een gebruikersinteractie, vindt het volgende plaats:

  1. Het MRTK-invoersysteem herkent dat er een invoergebeurtenis heeft plaatsgevonden.
  2. Het MRTK-invoersysteem schakelt de relevante interfacefunctie van de invoer-gebeurtenis door naar alle geregistreerde globale invoerhandlers
  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 gameobject te activeren.
    3. Als op enig moment een invoergebeurtenis is gemarkeerd als gebruikt, wordt het proces beëindigd en ontvangen geen verdere GameObjects callbacks.
      • Voorbeeld: onderdelen die de interface IMixedRealitySpeechHandler implementeren, worden gezocht wanneer een spraakopdracht wordt herkend.
      • Opmerking: het Unity-gebeurtenissysteem zal opbellen 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 invoerhandlers zijn geregistreerd en er geen GameObject wordt gevonden met een overeenkomend onderdeel/interface, roept het invoersysteem elke geregistreerde invoerhandler voor terugval aan

Notitie

Aanwijzerinvoergebeurtenissen worden op een iets andere manier verwerkt dan de invoergebeurtenisinterfaces die hierboven worden vermeld. Met name worden aanwijzerinvoergebeurtenissen alleen verwerkt door het GameObject waarop de focus is gericht door de aanwijzer die de invoergebeurtenis heeft geactiveerd, evenals eventuele globale invoerhandlers. Normale invoergebeurtenissen worden verwerkt door GameObjects met de focus voor alle actieve aanwijzers.

Voorbeeld van invoer gebeurtenisinterface

De onderstaande code laat het gebruik van de IMixedRealitySpeechHandler interface zien. Wanneer de gebruiker de woorden 'kleiner' of 'groter' zegt terwijl hij zich richt op een GameObject met deze ShowHideSpeechHandler klasse, wordt het GameObject zelf met de helft of twee keer zoveel 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

IMixedRealitySpeechHandler invoergebeurtenissen vereisen dat de gewenste trefwoorden vooraf zijn geregistreerd in het mrtk-profiel voor spraakopdrachten.

Registreren voor algemene invoerevenementen

Als u een onderdeel wilt maken dat luistert naar algemene invoerevenementen, zonder rekening te houden met welke GameObject mogelijk de focus heeft, moet een onderdeel zich registreren bij het invoersysteem. Na registratie ontvangen alle exemplaren van deze MonoBehaviour invoerevenementen, samen met alle GameObject(s) die momenteel de focus hebben en andere wereldwijd geregistreerde listeners.

Als een invoergebeurtenis is gemarkeerd als gebruikt, ontvangen globale geregistreerde handlers nog steeds callbacks. GameObjects met focus ontvangen de gebeurtenis echter niet.

Voorbeeld van registratie van globale invoer

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 terugvalinvoer gebeurtenissen

Terugvalinvoerhandlers zijn vergelijkbaar met geregistreerde globale invoerhandlers, maar worden behandeld als een laatste redmiddel voor de verwerking van invoerevenementen. Alleen als er geen algemene invoerhandlers zijn gevonden en er geen GameObjects in focus zijn, worden terugvalinvoerhandlers gebruikt.

Voorbeeld van terugvalinvoerhandler

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

Invoerevenementen stoppen

Elke invoer-gebeurtenisinterface biedt een BaseInputEventData gegevensobject als parameter voor elke functie op de interface. Dit gebeurtenisgegevensobject is een uitbreiding van het eigen AbstractEventDataobject van Unity.

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

Notitie

Een onderdeel dat de Use() methode aanroept, voorkomt dat andere GameObjects deze ontvangen. Andere onderdelen in het huidige GameObject ontvangen echter nog steeds de invoer-gebeurtenis en activeren eventuele gerelateerde interfacefuncties.

Zie ook