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:
- System wejściowy zestawu narzędzi MRTK rozpoznaje, że wystąpiło zdarzenie wejściowe.
- System wejściowy zestawu narzędzi 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 obiekcie GameObject.
- 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.
- 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ą 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 AbstractEventData
obiektu 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.