Zdarzenia wejściowe

Na poniższej liście przedstawiono wszystkie dostępne interfejsy zdarzeń wejściowych, które mają zostać zaimplementowane przez niestandardowy składnik MonoBehaviour. Te interfejsy będą wywoływane przez system wejściowy zestawu danych MRTK w celu obsługi niestandardowej logiki aplikacji opartej na interakcjach 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 będzie odbierać zdarzenia wejściowe tylko wtedy, gdy obiekt GameObject jest skoncentrowany przez wskaźnik lub element nadrzędny elementu GameObject w trybie koncentracji uwagi.

Program obsługi Zdarzenia Opis
IMixedRealitySourceStateHandler Wykryto/utracony źródło Wywoływane w przypadku wykrycia/zgubionego źródła danych wejściowych, na przykład w przypadku wykrycia lub zgubionego ręki.
IMixedRealitySourcePoseHandler Zmieniono ułożenie źródła Wywoływane w przypadku zmian pozycji źródła. Pozycja źródła reprezentuje ogólną postawę źródła wejściowego. Określone pozy, takie jak uchwyt lub wskaźnik pozy w sześciu kontrolerach DOF, można uzyskać za pośrednictwem funkcji IMixedRealityInputHandler<MixedRealityPose> .
IMixedRealityInputHandler Wejście w dół/w górę Wywoływane w przypadku zmian binarnych danych wejściowych, takich jak przyciski.
IMixedRealityInputHandler<T> Zmieniono dane wejściowe Wywoływane w przypadku zmian danych wejściowych danego typu. T może przyjmować następujące wartości:
- float (np. zwraca wyzwalacz analogiczny)
- Vector2 (np. zwraca kierunek pazy kciuka w klawiaturze do gier)
- Vector3 (np. położenie zwrotu śledzonego urządzenia)
- Quaternion (np. zwraca orientację śledzonego urządzenia)
- MixedRealityPose (np. zwraca w pełni śledzone urządzenie)
IMixedRealitySpeechHandler Rozpoznano słowo kluczowe mowy Wywoływana po rozpoznaniu jednego ze słów kluczowych skonfigurowanych w profilu poleceń mowy.
IMixedRealityDictationHandler Dyktowania
Hipoteza
Wynik
Ukończ
Błąd
Wywoływane przez systemy dyktowania w celu zgłaszania wyników sesji dyktowania.
IMixedRealityGestureHandler Zdarzenia gestu na:
Rozpoczęto
Po aktualizacji
Ukończone
Anulowane
Wywoływane w przypadku wykrywania gestów.
IMixedRealityGestureHandler<T> Gest zaktualizowany/zakończony Wywoływane w przypadku wykrywania gestów zawierających dodatkowe dane danego typu. Zobacz zdarzenia gestów, aby uzyskać szczegółowe informacje na temat możliwych wartości dla T.
IMixedRealityHandJointHandler Zaktualizowano ręcznie schłodną Podniesione przez układowe kontrolery rąk podczas aktualizowania rąk.
IMixedRealityHandMeshHandler Zaktualizowano siatkę ręczną Podniesione przez układowe kontrolery rąk podczas aktualizowania siatki rąk.
IMixedRealityInputActionHandler Akcja rozpoczęta/zakończona Podnieś , 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 wyzbyć się w ramach interakcji z użytkownikiem, mają miejsce następujące zdarzenia:

  1. System wejściowy MRTK rozpoznaje, że wystąpiło zdarzenie wejściowe.
  2. System wejściowy mrTK wyzsza odpowiednią funkcję interfejsu zdarzenia wejściowego dla wszystkich zarejestrowanych globalnych programów 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 projekt GameObject koncentruje się na bieżącym wskaźniku.
    2. System wejściowy używa systemu zdarzeń aparatu Unity do obsługi odpowiedniej funkcji interfejsu dla wszystkich pasujących składników w ukierunkowanych elementach GameObject.
    3. Jeśli w dowolnym momencie zdarzenie wejściowe zostało oznaczone jako użyte,proces zakończy się i żadne dalsze wywołania zwrotne nie będą odbierane przez żadne dalsze punkty GameObjects.
      • Przykład: składniki implementujące interfejs IMixedRealitySpeechHandler będą wyszukiwane po rozpoznaniu polecenia mowy.
      • Uwaga: System zdarzeń aparatu Unity będzie bąbelkować 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 żadne globalne programy obsługi danych wejściowych nie zostaną zarejestrowane i nie zostanie znaleziony żaden element GameObject z pasującymi składnikami/interfejsami, system wejściowy wywoła każdą zarejestrowaną rezerwową obsługę danych wejściowych

Uwaga

Zdarzenia wejściowe wskaźnika są obsługiwane w nieco inny sposób niż interfejsy zdarzeń wejściowych wymienione powyżej. W szczególności zdarzenia wejściowe wskaźnika są obsługiwane tylko przez gameObject w trybie koncentracji uwagi przez wskaźnik, który wyzłożył zdarzenie wejściowe , a także przez wszystkie globalne programy obsługi danych wejściowych. Zwykłe zdarzenia wejściowe są obsługiwane przez fokus GameObjects dla wszystkich aktywnych wskaźników.

Przykład interfejsu zdarzeń wejściowych

Poniższy kod demonstruje użycie IMixedRealitySpeechHandler interfejsu . Gdy użytkownik mówi wyrazy "mniejsze" lub "większe" podczas koncentrowania się na gameobject z tą klasą, projekt GameObject będzie skalowany o połowę lub dwa razy ShowHideSpeechHandler 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

IMixedRealitySpeechHandlerZdarzenia wejściowe wymagają wstępnej rejestracji żądanych słów kluczowych w profilu poleceń mowy mrTK.

Rejestrowanie zdarzeń globalnych danych wejściowych

Aby utworzyć składnik, który nasłuchuje globalnych zdarzeń wejściowych, pomijając fokus elementu GameObject, składnik musi zarejestrować się w systemie wejściowym. Po zarejestrowaniu wszystkie wystąpienia tego obiektu MonoBehaviour będą odbierać zdarzenia wejściowe wraz z dowolnymi obiektumi GameObject, które są aktualnie w trybie koncentracji, i innymi globalnie zarejestrowanymi odbiornikami.

Jeśli zdarzenie wejściowe zostało oznaczone jako używane,zarejestrowane globalnie procedury obsługi będą nadal otrzymywać wywołania zwrotne. Jednak żadne ukierunkowane projekt GameObjects nie odbierze zdarzenia.

Przykład globalnej rejestracji danych wejściowych

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 celu rezerwowych zdarzeń wejściowych

Rezerwowe programy obsługi danych wejściowych są podobne do zarejestrowanych globalnych programów obsługi danych wejściowych, ale są traktowane w ostateczności do obsługi zdarzeń wejściowych. Tylko wtedy, gdy nie znaleziono globalnych programów obsługi danych wejściowych i nie ma fokusu na żadnym gameobjects, zostaną one wykorzystywane jako rezerwowe programy obsługi danych wejściowych.

Przykład rezerwowej procedury 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 zdarzeń wejściowych udostępnia BaseInputEventData obiekt danych jako parametr dla każdej funkcji w interfejsie. Ten obiekt danych zdarzenia wykracza poza własny obiekt aparatu AbstractEventData Unity.

Aby zapobiec propagacji zdarzenia wejściowego przez jego wykonanie zgodnie z opisanym elementem ,składnik może wywołać wywołanie w celu oznaczenia zdarzenia AbstractEventData.Use() jako używanego. Spowoduje to zatrzymanie odbierania bieżącego zdarzenia wejściowego przez inne moduły GameObjects, z wyjątkiem globalnych programów obsługi danych wejściowych.

Uwaga

Składnik, który wywołuje metodę , zatrzyma odbieranie jej przez Use() inne elementy GameObjects. Jednak inne składniki bieżącego gameObject nadal będą odbierać zdarzenie wejściowe i będą wyzowały wszystkie powiązane funkcje interfejsu.

Zobacz też