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 MRTK w celu obsługi niestandardowej logiki aplikacji na podstawie interakcji wejściowych 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 Podniesione, gdy źródło danych wejściowych zostanie wykryte/utracone, na przykład po wykryciu lub utracie ścieżki przegubowej ręki.
IMixedRealitySourcePoseHandler Zmieniono pozwę źródłową Podniesione na podstawie zmian w źródle. Pozycja źródłowa reprezentuje ogólną postawę źródła wejściowego. Określone pozy, takie jak uchwyt lub wskaźnik w sześciu kontroleraCH DOF, można uzyskać za pośrednictwem .IMixedRealityInputHandler<MixedRealityPose>
IMixedRealityInputHandler Wejście w dół / w górę Podniesione na zmiany danych wejściowych binarnych, takich jak przyciski.
IMixedRealityInputHandler<T> Zmienione dane wejściowe Podniesione na zmiany w danych wejściowych danego typu. T może przyjmować następujące wartości:
- float (np. zwraca wyzwalacz analogowy)
- Vector2 (np. zwraca kierunek kciuka gamepad)
- Vector3 (np. pozycja zwracana ś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 do rozpoznawania jednego ze słów kluczowych skonfigurowanych w profilu poleceń mowy.
IMixedRealityDictationHandler Dyktowania
Hipoteza
Wynik
Ukończ
Błąd
Podniesione przez systemy dyktowania, aby zgłosić wyniki sesji dyktowania.
IMixedRealityGestureHandler Zdarzenia gestu dla:
Rozpoczęto
Po aktualizacji
Ukończone
Anulowane
Podniesione podczas wykrywania gestów.
IMixedRealityGestureHandler<T> Gest zaktualizowany /ukończony Podniesione podczas wykrywania gestów zawierających dodatkowe dane danego typu. Zobacz zdarzenia gestów , aby uzyskać szczegółowe informacje na temat możliwych wartości języka T.
IMixedRealityHandJointHandler Zaktualizowane stawy ręczne Podniesione przez przegubowych kontrolerów dłoni, gdy stawy dłoni są aktualizowane.
IMixedRealityHandMeshHandler Zaktualizowano siatkę hand Podniesione przez przegubowych kontrolerów dłoni po zaktualizowaniu siatki ręcznej.
IMixedRealityInputActionHandler Rozpoczęto/zakończono akcję Podnieś, aby wskazać początek akcji i koniec dla danych wejściowych mapowanych 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. Po uruchomieniu zdarzenia wejściowego za pośrednictwem interakcji użytkownika następuje:

  1. System wejściowy MRTK rozpoznaje, że wystąpiło zdarzenie wejściowe.
  2. System wejściowy 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 skoncentrowanym obiekcie GameObject.
    3. Jeśli w jakimkolwiek momencie zdarzenie wejściowe zostało oznaczone jako używane, proces zakończy się, a żadne dalsze obiekty GameObjects nie otrzymają 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ą rezerwową zarejestrowaną procedurę obsługi danych wejściowych

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 pokazuje użycie interfejsu IMixedRealitySpeechHandler . Gdy użytkownik powie słowa "mniejsze" lub "większe", koncentrując się na obiekcie GameObject z tą ShowHideSpeechHandler klasą, obiekt GameObject będzie skalować się 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, musi zarejestrować się w systemie wejściowym. Po zarejestrowaniu wszystkie wystąpienia tego modułu MonoBehaviour będą otrzymywać zdarzenia wejściowe wraz z dowolnymi obiektami GameObject aktualnie w centrum uwagi i innymi odbiornikami zarejestrowanymi na całym świecie.

Jeśli zdarzenie wejściowe zostało oznaczone jako używane, globalne zarejestrowane programy obsługi będą nadal odbierać wywołania zwrotne. Jednak żadne ukierunkowane obiekty GameObject 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, a żadne obiekty GameObject nie są w centrum uwagi, będą korzystać z rezerwowych procedur obsługi danych wejściowych.

Przykład procedury obsługi wejściowej rezerwowej

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 rozciąga się od własnego AbstractEventDataobiektu unity .

Aby zatrzymać propagację zdarzenia wejściowego przez jego wykonanie zgodnie z opisem, składnik może wywołać AbstractEventData.Use() znakowanie 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, który wywołuje metodę Use() , spowoduje zatrzymanie odbierania innych obiektów GameObject. 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ż