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:
- Vstupní systém MRTK rozpozná, že došlo ke vstupní události.
- 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.
- Pro každý aktivní ukazatel zaregistrovaný ve vstupním systému:
- Vstupní systém určuje, na který objekt GameObject je fokus aktuálního ukazatele.
- 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.
- 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.
- Příklad: Komponenty implementované rozhraní
- 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 AbstractEventData
objektu 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í.