Indatahändelser

I listan nedan beskrivs alla tillgängliga gränssnitt för indatahändelse som ska implementeras av en anpassad MonoBehaviour-komponent. Dessa gränssnitt anropas av MRTK-indatasystemet för att hantera anpassad applogik baserat på användarinteraktion. Indatahändelser för pekare hanteras något annorlunda än standardhändelsetyperna för indata nedan.

Viktigt

Som standard tar ett skript bara emot indatahändelser om det är GameObject i fokus av en pekare eller överordnad till ett GameObject i fokus.

Hanterare Händelser Description
IMixedRealitySourceStateHandler Källan har identifierats/förlorats Upphöjs när en indatakälla identifieras/förloras, till exempel när en tydligt hand identifieras eller går förlorad.
IMixedRealitySourcePoseHandler Källans attityd har ändrats Upphöjt vid ändringar i källställningen. Källställningen representerar den allmänna attityden för indatakällan. Specifika poser, till exempel pekreglaget eller pekaren i en sex DOF-kontrollant, kan hämtas via IMixedRealityInputHandler<MixedRealityPose> .
IMixedRealityInputHandler Indata ned/upp Upphöjt vid ändringar av binära indata, till exempel knappar.
IMixedRealityInputHandler<T> Indata har ändrats Upphöjt vid ändringar av indata för den angivna typen. T kan ha följande värden:
- float (returnerar t.ex. analog utlösare)
- Vector2 (returnerar t.ex. tumstickriktning för spelpad)
- Vector3 (t.ex. returposition för spårad enhet)
- Quaternion (t.ex. returnerar orientering för spårad enhet)
- MixedRealityPose (t.ex. returnerar fullständigt spårad enhet)
IMixedRealitySpeechHandler Speech Keyword Recognized Upphöjt vid igenkänning av ett av de nyckelord som konfigurerats i talkommandoprofilen.
IMixedRealityDictationHandler Diktamen
Hypotesen
Resultat
Klart
Fel
Upphöjt av dikteringssystem för att rapportera resultatet av en dikteringssession.
IMixedRealityGestureHandler Gesterhändelser på:
Börjat
Uppdaterad
Slutförd
Avbrutna
Upphöjt vid gestidentifiering.
IMixedRealityGestureHandler<T> Gest uppdaterad/slutförd Upphöjt vid identifiering av gester som innehåller ytterligare data av den angivna typen. Se gesterhändelser för information om möjliga värden för T.
IMixedRealityHandJointHandler Handförseningar uppdaterades Upphöjs av tydligt handkontrollers när handhållningen uppdateras.
IMixedRealityHandMeshHandler Hand Mesh har uppdaterats Upphöjt av tydligt handkontrollers när ett handnät uppdateras.
IMixedRealityInputActionHandler Åtgärden har startats/avslutats Höj för att ange åtgärdsstart och -slut för indata som mappats till åtgärder.

Indatahändelser i praktiken

På skriptnivå kan indatahändelser användas genom att implementera ett av de gränssnitt för händelsehanterare som visas i tabellen ovan. När en indatahändelse utspelar via en användarinteraktion sker följande:

  1. MRTK-indatasystemet identifierar att en indatahändelse har inträffat.
  2. MRTK-indatasystemet utser den relevanta gränssnittsfunktionen för indatahändelsen till alla registrerade globala indatahanterare
  3. För varje aktiv pekare som registrerats med indatasystemet:
    1. Indatasystemet avgör vilket GameObject som är i fokus för den aktuella pekaren.
    2. Indatasystemet använder Unitys händelsesystem för att utsända relevant gränssnittsfunktion för alla matchande komponenter i det fokuserade GameObject.
    3. Om en indatahändelse någon gång har markerats som använd avslutas processen och inga fler GameObjects får återanrop.
      • Exempel: Komponenter som IMixedRealitySpeechHandler implementerar gränssnittet genomsöks när ett talkommando identifieras.
      • Obs! Unity-händelsesystemet bubblar upp för att söka i det överordnade GameObject om det inte finns några komponenter som matchar det önskade gränssnittet i det aktuella GameObject.
  4. Om inga globala indatahanterare har registrerats och inget GameObject hittas med en matchande komponent/gränssnitt anropar indatasystemet varje registrerad indatahanterare för återställning

Anteckning

Indatahändelser för pekare hanteras på ett något annorlunda sätt än de gränssnitt för indatahändelser som anges ovan. I synnerhet hanteras indatahändelser för pekare endast av GameObject i fokus av pekaren som utloggade indatahändelsen – samt eventuella globala indatahanterare. Regelbundna indatahändelser hanteras av GameObjects i fokus för alla aktiva pekare.

Gränssnittsexempel för indatahändelse

Koden nedan visar hur gränssnittet IMixedRealitySpeechHandler används. När användaren säger orden "mindre" eller "större" och fokuserar på ett GameObject med den här klassen skalar GameObject sig själv med hälften eller ShowHideSpeechHandler dubbelt så mycket.

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

Anteckning

IMixedRealitySpeechHandler indatahändelser kräver att önskade nyckelord är förregistrerade i MRTK-talkommandoprofilen.

Registrera för globala indatahändelser

Om du vill skapa en komponent som lyssnar efter globala indatahändelser och ignorerar vad GameObject kan vara i fokus, måste en komponent registrera sig själv med indatasystemet. När den har registrerats tar alla instanser av denna MonoBehaviour emot indatahändelser tillsammans med alla GameObject(er) som för närvarande är i fokus och andra globala registrerade lyssnare.

Om en indatahändelse har markerats som användfår globala registrerade hanterare fortfarande återanrop. Dock tar inga fokuserade GameObjects emot händelsen.

Exempel på global indataregistrering

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

Registrera dig för reservindatahändelser

Reservinmatningshanterare liknar registrerade globala indatahanterare, men behandlas som en sista utväg för hantering av indatahändelse. Det är bara om inga globala indatahanterare hittades och inga GameObjects är i fokus som reservindatahanterare används.

Exempel på reservinmatningshanterare

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

Så här stoppar du indatahändelser

Varje gränssnitt för indatahändelse tillhandahåller BaseInputEventData ett dataobjekt som en parameter till varje funktion i gränssnittet. Det här händelsedataobjektet sträcker sig från Unitys egna AbstractEventData .

För att hindra en indatahändelse från att spridas genom körningen enligt beskrivningen kanen komponent anropa för att markera händelsen som AbstractEventData.Use() den används. Detta stoppar alla andra GameObjects från att ta emot den aktuella indatahändelsen, med undantag för globala indatahanterare.

Anteckning

En komponent som anropar Use() metoden stoppar andra GameObjects från att ta emot den. Andra komponenter i det aktuella GameObject kommer dock fortfarande att ta emot indatahändelsen och använda relaterade gränssnittsfunktioner.

Se även