Sdílet prostřednictvím


Vstupní události – MRTK2

Následující seznam popisuje všechna dostupná rozhraní vstupních událostí, která mají být implementována vlastní komponentou MonoBehaviour. Tato rozhraní budou volána vstupním systémem MRTK pro zpracování vlastní logiky aplikace na základě interakcí se vstupy uživatele. Vstupní události ukazatele se zpracovávají trochu jinak než standardní typy vstupních událostí níže.

Důležité

Ve výchozím nastavení bude skript přijímat vstupní události pouze v případě, že je objekt GameObject v fokusu ukazatelem nebo nadřazeným objektem GameObject v fokusu.

Obslužná rutina Události Popis
IMixedRealitySourceStateHandler Zjištěn/ztracený zdroj Vyvolá se při zjištění nebo ztrátě vstupního zdroje, například při zjištění kloubové ruky nebo ztrátě stopy.
IMixedRealitySourcePoseHandler Změna zdrojové pozice Vyvolána při změnách zdrojové pozice. Zdrojová pozice představuje obecnou pozici vstupního zdroje. Konkrétní pozice, jako je pozice úchytu nebo ukazatele v šesti řadičích DOF, lze získat prostřednictvím IMixedRealityInputHandler<MixedRealityPose>.
IMixedRealityInputHandler Vstup dolů nebo nahoru Vyvolány při změnách binárních vstupů, jako jsou tlačítka.
IMixedRealityInputHandler<T> Změněný vstup Vyvolána při změnách vstupů daného typu. T může mít následující hodnoty:
- float (např. vrátí analogovou aktivační událost)
- Vector2 (např. vrátí směr kryptografického ovladače gamepadu)
- Vector3 (např. návratová pozice sledovaného zařízení)
- Kvaternion (např. vrátí orientaci sledovaného zařízení)
- MixedRealityPose (např. vrátí plně sledované zařízení)
IMixedRealitySpeechHandler Rozpoznávání klíčového slova řeči Vyvolána při rozpoznávání jednoho z klíčových slov nakonfigurovaných v profilu hlasových příkazů.
IMixedRealityDictationHandler Diktování
Hypotéza
Výsledek
Dokončit
Chyba
Vyvolány systémy diktování za účelem hlášení výsledků relace diktování.
IMixedRealityGestureHandler Události gest na:
Zahájeno
Aktualizováno
Dokončeno
Zrušeno
Vyvolána při detekci gest.
IMixedRealityGestureHandler<T> Gesto aktualizováno / dokončeno Vyvolána při detekci gest obsahujících další data daného typu. Podrobnosti o možných hodnotách pro T najdete v tématu události gest.
IMixedRealityHandJointHandler Ruční klouby aktualizovány Zvednuté kloubovými ovladači rukou při aktualizaci ručních spojů.
IMixedRealityHandMeshHandler Aktualizovali jsme síťovinu rukou. Zvednuté kloubovými ovladači rukou při aktualizaci ruční sítě.
IMixedRealityInputActionHandler Akce byla spuštěna/ukončena Vytvoření označující začátek a konec akce pro vstupy namapované na akce

Vstupní události v akci

Na úrovni skriptu lze vstupní události využívat implementací jednoho z rozhraní obslužných rutin událostí uvedených v tabulce výše. Když se vstupní událost aktivuje prostřednictvím interakce uživatele, proběhne toto:

  1. Vstupní systém MRTK rozpozná, že došlo ke vstupní události.
  2. Vstupní systém MRTK aktivuje příslušnou funkci rozhraní vstupní události všem registrovaným globálním vstupním obslužným rutinám.
  3. Pro každý aktivní ukazatel zaregistrovaný ve vstupním systému:
    1. Vstupní systém určuje, na který objekt GameObject je fokus aktuálního ukazatele.
    2. Vstupní systém využívá systém událostí Unity k vyvolání příslušné funkce rozhraní pro všechny odpovídající komponenty na objektu GameObject s fokusem.
    3. Pokud je vstupní událost označena jako použitá, proces se ukončí a žádné další objekty GameObjects nebudou přijímat zpětná volání.
      • Příklad: Komponenty implementované rozhraní IMixedRealitySpeechHandler se vyhledá, když je rozpoznán příkaz řeči.
      • Poznámka: Systém událostí Unity bude bublina až hledat nadřazený GameObject, pokud nejsou nalezeny žádné komponenty odpovídající požadované rozhraní aktuální GameObject.
  4. Pokud nejsou zaregistrovány žádné obslužné rutiny globálního vstupu a nenajde se žádný objekt GameObject s odpovídající komponentou nebo rozhraním, pak vstupní systém zavolá každou obslužnou rutinu vstupu registrovaného pro náhradní použití.

Poznámka

Vstupní události ukazatele se zpracovávají mírně jiným způsobem než vstupní rozhraní událostí uvedená výše. Konkrétně jsou události vstupu ukazatele zpracovány pouze GameObject v fokusu ukazatelem, který aktivoval vstupní událost - stejně jako všechny globální obslužné rutiny vstupu. Běžné vstupní události jsou zpracovávány objekty GameObjects v fokusu pro všechny aktivní ukazatele.

Příklad rozhraní vstupních událostí

Následující kód ukazuje použití IMixedRealitySpeechHandler rozhraní. Když uživatel řekne slova "menší" nebo "větší", zatímco se zaměřuje na GameObject s touto ShowHideSpeechHandler třídou, GameObject se škáluje o polovinu nebo dvakrát tolik.

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

Poznámka

IMixedRealitySpeechHandler Vstupní události vyžadují, aby požadovaná klíčová slova byla předem zaregistrována v profilu MRTK Speech Commands.

Registrace globálních vstupních událostí

Chcete-li vytvořit komponentu, která naslouchá událostem globálního vstupu, bez ohledu na to, na co gameObject může být fokus, musí se komponenta zaregistrovat ve vstupním systému. Po registraci budou všechny instance tohoto MonoBehaviour přijímat vstupní události spolu se všemi objekty GameObject(s) aktuálně zaměřenými a dalšími globálně registrovanými naslouchacími procesy.

Pokud byla vstupní událost označena jako použitá, budou všechny globálně registrované obslužné rutiny stále přijímat zpětná volání. Událost však neobdrží žádné objekty GameObjects s fokusem.

Příklad globální registrace vstupu

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

Registrace pro události náhradního vstupu

Obslužné rutiny náhradního vstupu se podobají registrovaným globálním obslužným rutiným vstupu, ale považují se za poslední možnost pro zpracování vstupních událostí. Pouze v případě, že nebyly nalezeny žádné globální vstupní obslužné rutiny a žádné objekty GameObject nejsou v fokusu, budou se využívat obslužné rutiny náhradního vstupu.

Příklad obslužné rutiny náhradního vstupu

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

Postup zastavení vstupních událostí

Každé rozhraní vstupní události poskytuje BaseInputEventData datový objekt jako parametr pro každou funkci v rozhraní. Tento objekt dat události se rozšiřuje z vlastního AbstractEventDataobjektu Unity .

Pokud chcete zabránit šíření vstupní události v rámci jejího spuštění, jak je popsáno, může komponenta volat AbstractEventData.Use() a označit událost jako použitou. Tím se zastaví příjem aktuální vstupní události pro všechny ostatní objekty GameObject s výjimkou globálních obslužných rutin vstupu.

Poznámka

Komponenta, která volá metodu Use() , zastaví příjem jiných objektů GameObjects. Ostatní komponenty v aktuálním Objektu GameObject však stále obdrží vstupní událost a aktivují všechny související funkce rozhraní.

Viz také