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:
- System wejściowy MRTK rozpoznaje, że wystąpiło zdarzenie wejściowe.
- System wejściowy MRTK uruchamia odpowiednią funkcję interfejsu zdarzenia wejściowego dla wszystkich zarejestrowanych globalnych procedur obsługi danych wejściowych
- Dla każdego aktywnego wskaźnika zarejestrowanego w systemie wejściowym:
- System wejściowy określa, który obiekt GameObject jest fokusem dla bieżącego wskaźnika.
- System wejściowy wykorzystuje system zdarzeń aparatu Unity do wyzwalania odpowiedniej funkcji interfejsu dla wszystkich pasujących składników w skoncentrowanym obiekcie GameObject.
- 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.
- Przykład: Składniki implementowane interfejsu
- 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 AbstractEventData
obiektu 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.