Zdarzenia wejściowe — MRTK2

Poniższa lista przedstawia wszystkie dostępne interfejsy zdarzeń wejściowych, które mają być implementowane przez niestandardowy składnik MonoBehaviour. Te interfejsy będą wywoływane przez system wejściowy zestawu narzędzi MRTK w celu obsługi niestandardowej logiki aplikacji na podstawie interakcji z danymi wejściowymi użytkownika. Zdarzenia wejściowe wskaźnika są obsługiwane nieco inaczej niż standardowe typy zdarzeń wejściowych poniżej.

Ważne

Domyślnie skrypt odbiera zdarzenia wejściowe tylko wtedy, gdy obiekt GameObject jest fokusem przez wskaźnik lub element nadrzędny obiektu GameObject w fokusie.

Program obsługi Zdarzenia Opis
IMixedRealitySourceStateHandler Wykryto źródło/utracono Wywoływane po wykryciu/utracie źródła danych wejściowych, na przykład w przypadku wykrycia lub zagubienia ręki wyartykułej.
IMixedRealitySourcePoseHandler Zmieniono pozowanie źródłowe Podniesione po wprowadzeniu zmian w źródle. Pozycja źródłowa reprezentuje ogólną pozycję źródła wejściowego. Określone pozy, takie jak uchwyt lub wskaźnik w sześciu kontrolera DOF, można uzyskać za pośrednictwem .IMixedRealityInputHandler<MixedRealityPose>
IMixedRealityInputHandler Dane wejściowe w dół/w górę Podniesione na zmiany danych wejściowych binarnych, takich jak przyciski.
IMixedRealityInputHandler<T> Zmiany danych wejściowych Podniesione na zmiany danych wejściowych danego typu. T może przyjmować następujące wartości:
- float (np. zwraca wyzwalacz analogowy)
- Vector2 (np. zwraca kierunek szminki gamepad)
- Vector3 (np. pozycja powrotna śledzonego urządzenia)
- Quaternion (np. zwraca orientację śledzonego urządzenia)
- MixedRealityPose (np. zwraca w pełni śledzone urządzenie)
IMixedRealitySpeechHandler Rozpoznawanie słowa kluczowego mowy Podniesione przy rozpoznawaniu jednego ze słów kluczowych skonfigurowanych w profilu poleceń mowy.
IMixedRealityDictationHandler Dyktowania
Hipoteza
Wynik
Ukończ
Błąd
Podniesione przez systemy dyktowania w celu raportowania wyników sesji dyktowania.
IMixedRealityGestureHandler Zdarzenia gestu:
Rozpoczęto
Po aktualizacji
Ukończone
Anulowane
Podniesione przy wykrywaniu gestów.
IMixedRealityGestureHandler<T> Gest zaktualizowany/ukończony Podniesione po wykryciu gestów zawierających dodatkowe dane danego typu. Zobacz zdarzenia gestu , aby uzyskać szczegółowe informacje na temat możliwych wartości języka T.
IMixedRealityHandJointHandler Zaktualizowane stawy ręczne Podniesione przez przegubowe kontrolery rąk, gdy stawy ręczne są aktualizowane.
IMixedRealityHandMeshHandler Zaktualizowano ręcznie Mesh Podniesione przez przegubowe kontrolery rąk po zaktualizowaniu siatki ręcznej.
IMixedRealityInputActionHandler Rozpoczęto/zakończono akcję Podnieś wartość , aby wskazać początek i koniec akcji dla danych wejściowych zamapowanych na akcje.

Zdarzenia wejściowe w akcji

Na poziomie skryptu zdarzenia wejściowe mogą być używane przez zaimplementowanie jednego z interfejsów obsługi zdarzeń pokazanych w powyższej tabeli. Gdy zdarzenie wejściowe jest uruchamiane za pośrednictwem interakcji użytkownika, następuje:

  1. System wejściowy zestawu narzędzi MRTK rozpoznaje, że wystąpiło zdarzenie wejściowe.
  2. System wejściowy zestawu narzędzi MRTK uruchamia odpowiednią funkcję interfejsu zdarzenia wejściowego dla wszystkich zarejestrowanych globalnych procedur obsługi danych wejściowych
  3. Dla każdego aktywnego wskaźnika zarejestrowanego w systemie wejściowym:
    1. System wejściowy określa, który obiekt GameObject jest fokusem dla bieżącego wskaźnika.
    2. System wejściowy wykorzystuje system zdarzeń aparatu Unity do wyzwalania odpowiedniej funkcji interfejsu dla wszystkich pasujących składników w obiekcie GameObject.
    3. Jeśli w jakimkolwiek momencie zdarzenie wejściowe zostało oznaczone jako używane, proces zakończy się i żadne dalsze obiekty GameObjects nie będą otrzymywać wywołań zwrotnych.
      • Przykład: składniki implementowane interfejsu IMixedRealitySpeechHandler będą wyszukiwane po rozpoznaniu polecenia mowy.
      • Uwaga: system zdarzeń aparatu Unity będzie bąbelkowy w celu wyszukania nadrzędnego obiektu GameObject, jeśli w bieżącym obiekcie GameObject nie znaleziono żadnych składników pasujących do żądanego interfejsu.
  4. Jeśli nie zarejestrowano żadnych globalnych procedur obsługi danych wejściowych i nie znaleziono obiektu GameObject z pasującym składnikiem/interfejsem, system wejściowy wywoła każdą program obsługi wejściowej zarejestrowanej rezerwowej

Uwaga

Zdarzenia wejściowe wskaźnika są obsługiwane w nieco inny sposób niż interfejsy zdarzeń wejściowych wymienionych powyżej. W szczególności zdarzenia wejściowe wskaźnika są obsługiwane tylko przez obiekt GameObject w fokusie przez wskaźnik, który wystrzelił zdarzenie wejściowe , a także wszelkie globalne programy obsługi danych wejściowych. Regularne zdarzenia wejściowe są obsługiwane przez obiekty GameObject w fokusie dla wszystkich aktywnych wskaźników.

Przykład interfejsu zdarzeń wejściowych

Poniższy kod demonstruje użycie interfejsu IMixedRealitySpeechHandler . Gdy użytkownik mówi słowa "mniejsze" lub "większe", koncentrując się na obiekcie GameObject z tą ShowHideSpeechHandler klasą, obiekt GameObject będzie skalowany o połowę lub dwa razy więcej.

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

Uwaga

IMixedRealitySpeechHandler Zdarzenia wejściowe wymagają, aby żądane słowa kluczowe zostały wstępnie zarejestrowane w profilu poleceń mowy zestawu narzędzi MRTK.

Rejestrowanie pod kątem globalnych zdarzeń wejściowych

Aby utworzyć składnik, który nasłuchuje globalnych zdarzeń wejściowych, pomijając element GameObject, który może być w centrum uwagi, składnik musi zarejestrować się w systemie wejściowym. Po zarejestrowaniu wszystkie wystąpienia tego obiektu MonoBehaviour będą otrzymywać zdarzenia wejściowe wraz z dowolnymi obiektami GameObject aktualnie w centrum uwagi i innymi odbiornikami zarejestrowanymi w skali globalnej.

Jeśli zdarzenie wejściowe zostało oznaczone jako używane, globalne zarejestrowane programy obsługi nadal będą odbierać wywołania zwrotne. Jednak żadne ukierunkowane obiekty GameObjects nie otrzymają zdarzenia.

Przykład rejestracji danych wejściowych globalnych

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

Rejestrowanie w przypadku zdarzeń wejściowych rezerwowych

Rezerwowe programy obsługi danych wejściowych są podobne do zarejestrowanych globalnych procedur obsługi danych wejściowych, ale są traktowane jako ostateczność obsługi zdarzeń wejściowych. Tylko wtedy, gdy nie znaleziono żadnych globalnych procedur obsługi danych wejściowych i żadne obiekty GameObjects nie są skoncentrowane na rezerwowych programach obsługi danych wejściowych.

Przykład rezerwowego programu obsługi danych wejściowych

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

Jak zatrzymać zdarzenia wejściowe

Każdy interfejs zdarzenia wejściowego BaseInputEventData udostępnia obiekt danych jako parametr dla każdej funkcji w interfejsie. Ten obiekt danych zdarzenia wykracza od własnego AbstractEventDataobiektu danych aparatu Unity.

Aby zatrzymać propagację zdarzenia wejściowego przez jego wykonanie zgodnie z opisem, składnik może wywołać AbstractEventData.Use() funkcję oznaczania zdarzenia jako używanego. Spowoduje to zatrzymanie odbierania bieżącego zdarzenia wejściowego przez inne obiekty GameObject z wyjątkiem globalnych procedur obsługi danych wejściowych.

Uwaga

Składnik wywołujący metodę Use() spowoduje zatrzymanie odbierania innych obiektów GameObjects. Jednak inne składniki w bieżącym obiekcie GameObject nadal będą otrzymywać zdarzenie wejściowe i uruchamiać wszystkie powiązane funkcje interfejsu.

Zobacz też