Interaktives Element [Experimentell] — MRTK2

Ein vereinfachter zentralisierter Einstiegspunkt zum MRTK-Eingabesystem. Enthält Zustandsverwaltungsmethoden, Ereignisverwaltung und die Zustandseinstellungslogik für Kerninteraktionszustände.

Interactive Element ist ein experimentelles Feature, das in Unity 2019.3 und höher unterstützt wird, da es eine Funktion nutzt, die neu in Unity 2019.3: Serialisieren referenz ist.

Interaktiver Elementinspektor

Während des Wiedergabemodus liefert der Interaktive Elementinspektor visuelles Feedback, das angibt, ob der aktuelle Zustand aktiv ist oder nicht. Wenn ein Zustand aktiv ist, wird er mit einer Zyanfarbe hervorgehoben. Wenn der Zustand nicht aktiv ist, wird die Farbe nicht geändert. Die Zahlen neben den Zuständen im Inspektor sind die Zustandswerte. Wenn der Zustand aktiv ist, ist der Wert 1, wenn der Zustand nicht aktiv ist, ist der Wert 0.

Interaktives Element mit virtueller Handinteraktion

Kernzustände

Interactive Element enthält Kernzustände und unterstützt das Hinzufügen von benutzerdefinierten Zuständen. Bei einem Kernzustand handelt es sich um einen Zustand, in dem bereits die Zustandseinstellungslogik in BaseInteractiveElementdefiniert ist. Im Folgenden finden Sie eine Liste der aktuellen eingabegesteuerten Kernzustände:

Aktueller Kernstatus

Nah- und Ferninteraktionskernzustände:

Near Interaction Core-Zustände:

Ferninteraktions-Kernzustände:

Andere Kernzustände:

Hinzufügen eines Kernzustands über den Inspektor

  1. Navigieren Sie im Inspektor für interaktives Element zu Kernzustand hinzufügen .

    Hinzufügen eines Kernzustands über den Inspektor

  2. Wählen Sie die Schaltfläche Zustand auswählen aus, um den hinzuzufügenden Kernzustand auszuwählen. Die Zustände im Menü sind nach Interaktionstyp sortiert.

    Hinzufügen eines Kernzustands über den Inspektor mit ausgewähltem Status

  3. Öffnen Sie das Ausklappen der Ereigniskonfiguration, um die Ereignisse und Eigenschaften anzuzeigen, die dem Zustand zugeordnet sind.

    Hinzufügen eines Kernzustands über den Inspektor mit Ereigniskonfiguration

Hinzufügen eines Kernzustands per Skript

Verwenden Sie die AddNewState(stateName) -Methode, um einen Kernzustand hinzuzufügen. Verwenden Sie für eine Liste der verfügbaren Namen des Kernzustands die CoreInteractionState Enumeration.

// Add by name or add by CoreInteractionState enum to string

interactiveElement.AddNewState("SelectFar");

interactiveElement.AddNewState(CoreInteractionState.SelectFar.ToString());

Zustandsinterne Struktur

Die Zustände in Interactive Element sind vom Typ InteractionState. Ein InteractionState enthält die folgenden Eigenschaften:

  • Name: Der Name des Zustands.
  • Wert: Der Zustandswert. Wenn der Zustand aktiviert ist, ist der Statuswert 1. Wenn der Zustand deaktiviert ist, ist der Statuswert 0.
  • Aktiv: Gibt an, ob der Status aktuell aktiv ist. Der Wert für die Active-Eigenschaft ist true, wenn der Zustand aktiviert ist, false, wenn der Zustand deaktiviert ist.
  • Interaktionstyp: Der Interaktionstyp eines Zustands ist der Typ der Interaktion, für die ein Zustand vorgesehen ist.
    • None: Unterstützt keine Form der Eingabeinteraktion.
    • Near: Unterstützung nahezuer Interaktion. Eingabe wird als interaktionsnah betrachtet, wenn eine artikulierte Hand direkten Kontakt mit einem anderen Spielobjekt hat, d. h. die Position der artikulierten Hand ist nahe an der Position des Spielobjekts im Weltraum.
    • Far: Unterstützung der Ferninteraktion. Eingaben gelten als weit entfernte Interaktion, wenn kein direkter Kontakt mit dem Spielobjekt erforderlich ist. Beispielsweise wird die Eingabe über Controllerstrahl oder Blick als Ferninteraktionseingabe betrachtet.
    • NearAndFar: Umfasst die Unterstützung von Nah- und Ferninteraktionen.
    • Other: Unterstützung der unabhängigen Interaktion mit Zeigern.
  • Ereigniskonfiguration: Die Ereigniskonfiguration für einen Zustand ist der Einstiegspunkt des serialisierten Ereignisprofils.

Alle diese Eigenschaften werden intern in der State Manager in Interactive Element enthaltenen festgelegt. Verwenden Sie zum Ändern von Zuständen die folgenden Hilfsmethoden:

Hilfsmethoden für Zustandseinstellungen

// Get the InteractionState
interactiveElement.GetState("StateName");

// Set a state value to 1/on
interactiveElement.SetStateOn("StateName");

// Set a state value to 0/off
interactiveElement.SetStateOff("StateName");

// Check if a state is present in the state list
interactiveElement.IsStatePresent("StateName");

// Check whether or not a state is active
interactiveElement.IsStateActive("StateName");

// Add a new state to the state list
interactiveElement.AddNewState("StateName");

// Remove a state from the state list
interactiveElement.RemoveState("StateName");

Das Abrufen der Ereigniskonfiguration eines Zustands bezieht sich auf den Zustand selbst. Jeder Kernzustand verfügt über einen bestimmten Ereigniskonfigurationstyp, der unten in den Abschnitten beschrieben wird, die jeden Kernzustand beschreiben.

Hier ist ein generalisiertes Beispiel für das Abrufen der Ereigniskonfiguration eines Zustands:

// T varies depending on the core state - the specific T's are specified under each of the core state sections
T stateNameEvents = interactiveElement.GetStateEvents<T>("StateName");

Standardzustand

Der Standardzustand ist in einem interaktiven Element immer vorhanden. Dieser Zustand ist nur aktiv, wenn alle anderen Zustände nicht aktiv sind. Wenn ein anderer Zustand aktiv wird, wird der Standardzustand intern auf deaktiviert festgelegt.

Ein interaktives Element wird mit den Status Standard und Fokus initialisiert, die in der Statusliste vorhanden sind. Der Standardzustand muss immer in der Statusliste vorhanden sein.

Abrufen von Standardzustandsereignissen

Ereigniskonfigurationstyp für den Standardzustand: StateEvents

StateEvents defaultEvents = interactiveElement.GetStateEvents<StateEvents>("Default");

defaultEvents.OnStateOn.AddListener(() =>
{
    Debug.Log($"{gameObject.name} Default State On");
});

defaultEvents.OnStateOff.AddListener(() =>
{
    Debug.Log($"{gameObject.name} Default State Off");
});

Fokuszustand

Der Fokuszustand ist ein Nah- und Ferninteraktionszustand, der als Mixed Reality-Äquivalent zum Hovern betrachtet werden kann. Der Unterscheidungsfaktor zwischen Nah- und Ferninteraktion für den Fokuszustand ist der aktuelle aktive Zeigertyp. Wenn der Zeigertyp für den Fokuszustand der Poke-Zeiger ist, wird die Interaktion als interaktionsnah betrachtet. Wenn der primäre Zeiger nicht der Poke-Zeiger ist, wird die Interaktion als weit entfernte Interaktion betrachtet. Der Fokuszustand ist standardmäßig im interaktiven Element vorhanden.

Fokuszustand VerhaltenFokuszustand mit virtueller Handinteraktion

FokuszustandsinspektorFokuszustand im Inpsector

Abrufen von Fokuszustandsereignissen

Ereigniskonfigurationstyp für den Fokuszustand: FocusEvents

FocusEvents focusEvents = interactiveElement.GetStateEvents<FocusEvents>("Focus");

focusEvents.OnFocusOn.AddListener((pointerEventData) =>
{
    Debug.Log($"{gameObject.name} Focus On");
});

focusEvents.OnFocusOff.AddListener((pointerEventData) =>
{
    Debug.Log($"{gameObject.name} Focus Off");
});

Verhalten von "Focus Near" und "Focus Far"

Fokus nah und fern mit virtueller Handinteraktion

Fokus in Der Nähe des Zustands

Der Fokus-Near-Zustand wird festgelegt, wenn ein Fokusereignis ausgelöst wird, und der primäre Zeiger ist der Poke-Zeiger, ein Hinweis auf eine nahe Interaktion.

Focus Near State BehaviorFocus Near State Focus near state with virtual hand interaction

Fokus in der Nähe des ZustandsinspektorsFokus in der Nähe der Komponente im Inspektor

Abrufen von FocusNear State-Ereignissen

Ereigniskonfigurationstyp für den FocusNear-Zustand: FocusEvents

FocusEvents focusNearEvents = interactiveElement.GetStateEvents<FocusEvents>("FocusNear");

focusNearEvents.OnFocusOn.AddListener((pointerEventData) =>
{
    Debug.Log($"{gameObject.name} Near Interaction Focus On");
});

focusNearEvents.OnFocusOff.AddListener((pointerEventData) =>
{
    Debug.Log($"{gameObject.name} Near Interaction Focus Off");
});

Fokus Far State

Der Fokus far-Zustand wird festgelegt, wenn der primäre Zeiger nicht der Poke-Zeiger ist. Beispielsweise werden der Standardstrahlzeiger des Controllers und der GGV-Zeiger (Blick, Geste, Stimme) als weit entfernte Interaktionszeiger betrachtet.

Focus Far State BehaviorFokuszustand weit mit virtueller Handinteraktion

Fokus Far State InspectorFokus far -Komponente im Inspektor

Abrufen von Fokus-Fernzustandsereignissen

Ereigniskonfigurationstyp für den FocusFar-Zustand: FocusEvents

FocusEvents focusFarEvents = interactiveElement.GetStateEvents<FocusEvents>("FocusFar");

focusFarEvents.OnFocusOn.AddListener((pointerEventData) =>
{
    Debug.Log($"{gameObject.name} Far Interaction Focus On");
});

focusFarEvents.OnFocusOff.AddListener((pointerEventData) =>
{
    Debug.Log($"{gameObject.name} Far Interaction Focus Off");
});

Touchzustand

Der Touch-Zustand ist ein Nahezu-Interaktionszustand, der festgelegt wird, wenn eine handgelenkte Hand das Objekt direkt berührt. Eine direkte Berührung bedeutet, dass sich der Zeigefinger der Hand sehr nahe an der Weltposition des Objekts befindet. Standardmäßig wird eine NearInteractionTouchableVolume Komponente an das -Objekt angefügt, wenn der Zustandsliste touch hinzugefügt wird. Das Vorhandensein einer NearInteractionTouchableVolume - oder NearInteractionTouchable -Komponente ist erforderlich, um Touchereignisse zu erkennen. Der Unterschied zwischen NearInteractionTouchableVolume und NearInteractionTouchable besteht darin, dass NearInteractionTouchableVolume eine Berührung basierend auf dem Collider des Objekts erkannt wird und NearInteractionTouchabledie Berührung innerhalb eines definierten Bereichs einer Ebene erkannt wird.

TouchzustandsverhaltenTouchzustand mit virtueller Handinteraktion

TouchZustandsinspektorTouchstatuskomponente im Inspektor

Abrufen von Touchzustandsereignissen

Ereigniskonfigurationstyp für den Touchzustand: TouchEvents

TouchEvents touchEvents = interactiveElement.GetStateEvents<TouchEvents>("Touch");

touchEvents.OnTouchStarted.AddListener((touchData) =>
{
    Debug.Log($"{gameObject.name} Touch Started");
});

touchEvents.OnTouchCompleted.AddListener((touchData) =>
{
    Debug.Log($"{gameObject.name} Touch Completed");
});

touchEvents.OnTouchUpdated.AddListener((touchData) =>
{
    Debug.Log($"{gameObject.name} Touch Updated");
});

Fernen Zustand auswählen

Der Zustand "Weit auswählen" ist die IMixedRealityPointerHandler angezeigte. Bei diesem Zustand handelt es sich um einen fernen Interaktionszustand, der das Klicken der fernen Interaktion (Luft tippen) erkennt und durch die Verwendung von fernen Interaktionszeigern wie dem Standard-Controllerstrahlzeiger oder dem GGV-Zeiger hält. Der Zustand "Weit auswählen" enthält eine Option unter dem Ausklappungsklappout der Ereigniskonfiguration mit dem Namen Global. Wenn Global true ist, wird der IMixedRealityPointerHandler als globaler Eingabehandler registriert. Der Fokus auf ein Objekt ist nicht erforderlich, um Eingabesystemereignisse auszulösen, wenn ein Handler als global registriert ist. Wenn ein Benutzer beispielsweise wissen möchte, wann immer die Luft tippen/auswählen-Geste unabhängig vom Objekt im Fokus ausgeführt wird, legen Sie auf true fest Global .

Fernzustandsverhalten auswählenMit virtueller Handinteraktion weit auswählen

Wählen Sie Far State InspectorSelect far component in the Inspector (Far State Inspector) aus.

Abrufen ausgewählter Fernzustandsereignisse

Ereigniskonfigurationstyp für den SelectFar-Zustand: SelectFarEvents

SelectFarEvents selectFarEvents = interactiveElement.GetStateEvents<SelectFarEvents>("SelectFar");

selectFarEvents.OnSelectUp.AddListener((pointerEventData) =>
{
    Debug.Log($"{gameObject.name} Far Interaction Pointer Up");
});

selectFarEvents.OnSelectDown.AddListener((pointerEventData) =>
{
    Debug.Log($"{gameObject.name} Far Interaction Pointer Down");
});

selectFarEvents.OnSelectHold.AddListener((pointerEventData) =>
{
    Debug.Log($"{gameObject.name} Far Interaction Pointer Hold");
});

selectFarEvents.OnSelectClicked.AddListener((pointerEventData) =>
{
    Debug.Log($"{gameObject.name} Far Interaction Pointer Clicked");
});

Geklickter Zustand

Der Status Clicked wird standardmäßig durch einen Ferninteraktionsklick (Far-Zustand auswählen) ausgelöst. Dieser Zustand wird intern auf Ein aktiviert, ruft das OnClicked-Ereignis auf und wird dann sofort auf deaktiviert.

Hinweis

Das visuelle Feedback im Inspektor basierend auf der Zustandsaktivität ist für den Zustand Geklickt nicht vorhanden, da es sofort aktiviert und dann deaktiviert wird.

Geklicktes ZustandsverhaltenGeklickter Zustand mit Interaktionen mit virtueller Hand

Klicken Sie auf ZustandsinspektorKlicken Sie auf Zustandskomponente im Inspektor.

Beispiel für "Nah- und Fern"-Zustand
Der angeklickte Zustand kann mithilfe der interactiveElement.TriggerClickedState() -Methode über zusätzliche Einstiegspunkte ausgelöst werden. Wenn ein Benutzer beispielsweise eine berührungsnahe Interaktion wünscht, um auch einen Klick auf ein Objekt auszulösen, fügt er die TriggerClickedState() Methode als Listener im Touchzustand hinzu.

Nah- und Fernzustand mit Virtuellen Handinteraktionen

Get Clicked State Events (Get Clicked State Events)

Ereigniskonfigurationstyp für den Angeklickten Zustand: ClickedEvents

ClickedEvents clickedEvent = interactiveElement.GetStateEvents<ClickedEvents>("Clicked");

clickedEvent.OnClicked.AddListener(() =>
{
    Debug.Log($"{gameObject.name} Clicked");
});

Ein- und Ausschalten des Zustands

Die Zustände Ein- und Ausschalten sind ein Paar, und beide müssen für das Umschaltverhalten vorhanden sein. Standardmäßig werden die Zustände Ein- und Ausschalten durch einen Klick mit der fernen Interaktion ausgelöst (Far-Zustand auswählen). Standardmäßig ist der Zustand "Aus umschalten" beim Start aktiv, was bedeutet, dass der Umschalter mit deaktiviert initialisiert wird. Wenn ein Benutzer möchte, dass der Zustand "Ein umschalten" beim Start aktiv sein soll, legen Sie im Zustand Ein umschalten auf true fest IsSelectedOnStart .

Ein- und Ausschalten des Zustandsverhaltensmit virtuellen Handinteraktionen ein- und ausschalten

Ein- und Ausschalten der Zustandsinspektor-Komponenteim Inspektor

Beispiel für Nah- und Fern-Umschaltzustände
Ähnlich wie beim Zustand Geklickt kann die Einstellung zum Umschalten des Zustands mehrere Einstiegspunkte mit der interactiveElement.SetToggleStates() -Methode aufweisen. Wenn ein Benutzer beispielsweise touch als zusätzlichen Einstiegspunkt zum Festlegen der Umschaltzustände verwenden möchte, fügt er die SetToggleStates() -Methode einem der Ereignisse im Touch-Zustand hinzu.

Nah und fern umschalten mit virtuellen Handinteraktionen

Ein- und Ausschalten von Zustandsereignissen

Ereigniskonfigurationstyp für den ToggleOn-Zustand: ToggleOnEvents
Ereigniskonfigurationstyp für den ToggleOff-Zustand: ToggleOffEvents

// Toggle On Events
ToggleOnEvents toggleOnEvent = interactiveElement.GetStateEvents<ToggleOnEvents>("ToggleOn");

toggleOnEvent.OnToggleOn.AddListener(() =>
{
    Debug.Log($"{gameObject.name} Toggled On");
});

// Toggle Off Events
ToggleOffEvents toggleOffEvent = interactiveElement.GetStateEvents<ToggleOffEvents>("ToggleOff");

toggleOffEvent.OnToggleOff.AddListener(() =>
{
    Debug.Log($"{gameObject.name} Toggled Off");
});

Speech-Schlüsselwortstatus

Der Speech-Schlüsselwortzustand lauscht auf die Schlüsselwörter, die im Mixed Reality Speech-Profil definiert sind. Alle neuen Schlüsselwort (keyword) müssen vor der Laufzeit im Sprachbefehlsprofil registriert werden (schritte unten).

Speech-SchlüsselwortstatusverhaltenSpracherkennung Schlüsselwort (keyword) mit virtueller Interaktion

Speech-SchlüsselwortzustandsinspektorSpeech Schlüsselwort (keyword) Komponente im Inspektor

Hinweis

Der Speech-Schlüsselwortzustand wurde im Editor durch Drücken der F5-Taste in der gif oben ausgelöst. Die Einrichtung in Editortests für Sprache finden Sie in den folgenden Schritten.

Registrieren eines Sprachbefehls/Schlüsselworts

  1. Wählen Sie das MixedRealityToolkit-Spielobjekt aus.

  2. Wählen Sie Kopieren und Anpassen des aktuellen Profils aus.

  3. Navigieren Sie zum Abschnitt Eingabe, und wählen Sie Klonen aus, um die Änderung des Eingabeprofils zu aktivieren.

  4. Scrollen Sie im Eingabeprofil nach unten zum Abschnitt Speech, und klonen Sie das Sprachprofil.

    Speech Schlüsselwort (keyword)-Profil im MRTK-Spielobjekt

  5. Wählen Sie Den Befehl "Neue Sprache hinzufügen" aus.

    Hinzufügen einer neuen Sprache Schlüsselwort (keyword) im MRTK-Profil

  6. Geben Sie die neue Schlüsselwort (keyword) ein. Optional: Ändern Sie keyCode in F5 (oder einen anderen KeyCode), um tests im Editor zu ermöglichen.

    Konfigurieren von Sprach Schlüsselwort (keyword) im MRTK-Profil

  7. Zurück zum Zustandsinspektor des Interactive Element Speech-Schlüsselworts, und wählen Sie Schlüsselwort hinzufügen aus.

    Hinzufügen von Schlüsselwort (keyword) zur interaktiven Elementkomponente

    Schlüsselwortüberprüfung und -registrierung

  8. Geben Sie die neue Schlüsselwort (keyword) ein, die soeben im Speech-Profil registriert wurde.

    Eingabe neuer Spracherkennungs-Schlüsselwort (keyword)

Um den Speech-Schlüsselwortstatus im Editor zu testen, drücken Sie den KeyCode, der in Schritt 6 (F5) definiert wurde, um die Spracherkennung Schlüsselwort (keyword) erkanntes Ereignis zu simulieren.

Abrufen von Speech-Schlüsselwortzustandsereignissen

Ereigniskonfigurationstyp für den SpeechKeyword-Zustand: SpeechKeywordEvents

SpeechKeywordEvents speechKeywordEvents = interactiveElement.GetStateEvents<SpeechKeywordEvents>("SpeechKeyword");

speechKeywordEvents.OnAnySpeechKeywordRecognized.AddListener((speechEventData) =>
{
    Debug.Log($"{speechEventData.Command.Keyword} recognized");
});

// Get the "Change" Keyword event specifically
KeywordEvent keywordEvent = speechKeywordEvents.Keywords.Find((keyword) => keyword.Keyword == "Change");

keywordEvent.OnKeywordRecognized.AddListener(() =>
{ 
    Debug.Log("Change Keyword Recognized"); 
});

Benutzerdefinierte Zustände

Erstellen eines benutzerdefinierten Zustands über den Inspektor

Der über den Inspektor erstellte benutzerdefinierte Zustand wird mit der Standardzustandsereigniskonfiguration initialisiert. Die Standardereigniskonfiguration für einen benutzerdefinierten Zustand ist vom Typ StateEvents und enthält die Ereignisse OnStateOn und OnStateOff.

  1. Navigieren Sie im Inspektor für interaktives Element zu Benutzerdefiniertem Zustand erstellen .

    Erstellen eines benutzerdefinierten Zustands

  2. Geben Sie den Namen des neuen Zustands ein. Dieser Name muss eindeutig sein und darf nicht mit den vorhandenen Kernzuständen übereinstimmen.

    Eingeben des Namens eines neuen benutzerdefinierten Zustands

  3. Wählen Sie Zustandsname festlegen aus, um der Statusliste hinzuzufügen.

    Hinzufügen eines benutzerdefinierten Zustands zur Zustandsliste

    Dieser benutzerdefinierte Zustand wird mit der Standardereigniskonfiguration StateEvents initialisiert, die die OnStateOn Ereignisse und OnStateOff enthält. Informationen zum Erstellen einer benutzerdefinierten Ereigniskonfiguration für einen neuen Zustand finden Sie unter Erstellen eines benutzerdefinierten Zustands mit einer benutzerdefinierten Ereigniskonfiguration.

    Neuer Zustand, der in der interaktiven Elementkomponente angezeigt wird

Erstellen eines benutzerdefinierten Zustands per Skript

interactiveElement.AddNewState("MyNewState");

// A new state by default is initialized with a the default StateEvents configuration which contains the 
// OnStateOn and OnStateOff events

StateEvents myNewStateEvents = interactiveElement.GetStateEvents<StateEvents>("MyNewState");

myNewStateEvents.OnStateOn.AddListener(() =>
{
    Debug.Log($"MyNewState is On");
});

Erstellen eines benutzerdefinierten Zustands mit einer benutzerdefinierten Ereigniskonfiguration

Beispieldateien für einen benutzerdefinierten Zustand namens Tastatur befinden sich hier: MRTK\SDK\Experimental\InteractiveElement\Examples\Scripts\CustomStateExample

Die folgenden Schritte durchlaufen ein vorhandenes Beispiel zum Erstellen einer benutzerdefinierten Zustandsereigniskonfiguration und Empfängerdateien.

  1. Stellen Sie sich einen Zustandsnamen vor. Dieser Name muss eindeutig sein und darf nicht mit den vorhandenen Kernzuständen übereinstimmen. Für die Zwecke dieses Beispiels lautet der Zustandsname Tastatur.

  2. Erstellen Sie zwei CS-Dateien mit dem Namen Zustandsname + "Empfänger" und Zustandsname + "Ereignisse". Die Benennung dieser Dateien wird intern berücksichtigt und muss dem Statusnamen + Ereignis/Empfänger-Konvention folgen.

    Skripts für den Tastaturzustand

  3. Weitere Informationen zum Dateiinhalt finden Sie in den Dateien KeyboardEvents.cs und KeyboardReceiver.cs. Neue Ereigniskonfigurationsklassen müssen von erben BaseInteractionEventConfiguration , und neue Ereignisempfängerklassen müssen von erben BaseEventReceiver. Beispiele für Zustandseinstellungen für den Tastaturzustand befinden sich in der CustomStateSettingExample.cs Datei.

  4. Fügen Sie den Status dem interaktiven Element mithilfe des Statusnamens hinzu. Der Statusname wird erkannt, wenn Ereigniskonfigurations- und Ereignisempfängerdateien vorhanden sind. Die Eigenschaften in der benutzerdefinierten Ereigniskonfigurationsdatei sollten im Inspektor angezeigt werden.

    Hinzufügen eines benutzerdefinierten Zustands zu einem interaktiven ElementBenutzerdefinierter Zustand, der im interaktiven Element erkannt wird

  5. Weitere Beispiele für Ereigniskonfigurations- und Ereignisempfängerdateien finden Sie in den Dateien unter den folgenden Pfaden:

  • MRTK\SDK\Experimental\InteractiveElement\InteractiveElement\Events\EventConfigurations
  • MRTK\SDK\Experimental\InteractiveElement\InteractiveElement\Events\EventReceivers

Beispielszene

Die Beispielszene für Interactive Element + State Visualizer befindet sich hier: MRTK\SDK\Experimental\InteractiveElement\Examples\InteractiveElementExampleScene.unity

Beispielszene mit interaktivem Element und Zustandsvisualisierer

Komprimierbare Schaltfläche

Die Beispielszene enthält Prefabs namens CompressableButton und CompressableButtonToggle, diese Prefabs Spiegel das Verhalten der PressableButtonHoloLens2 Schaltflächen, die mithilfe des interaktiven Elements und der Zustandsschnellansicht erstellt werden. Die CompressableButton Komponente ist derzeit eine Kombination von PressableButton + PressableButtonHoloLens2 mit BaseInteractiveElementals Basisklasse.

Zustandsvisualisierer [Experimentell]

Die State Visualizer-Komponente fügt einem Objekt Animationen basierend auf den in einer verknüpften Interactive Element-Komponente definierten Zuständen hinzu. Diese Komponente erstellt Animationsobjekte, platziert sie im Ordner MixedRealityToolkit.Generated und ermöglicht eine vereinfachte Einstellung des Animations-Keyframes, indem einem Zielspielobjekt Animatable-Eigenschaften hinzugefügt werden. Um Animationsübergänge zwischen Zuständen zu aktivieren, wird ein Animator Controller-Objekt erstellt und ein Standardzustandscomputer mit zugeordneten Parametern und allen Zustandsübergängen generiert. Der Zustandscomputer kann im Animatorfenster von Unity angezeigt werden.

Zustandsvisualisierer und Unity-Animationssystem

Die State Visualizer nutzt derzeit das Unity Animation System.

Wenn die Schaltfläche Neue Animationsclips generieren in der Zustandsschnellansicht gedrückt wird, werden neue Animationsclipressourcen basierend auf den Statusnamen in Interactive Element generiert und im Ordner MixedRealityToolkit.Generated abgelegt. Die Animation Clip-Eigenschaft in jedem Zustandscontainer ist auf den zugeordneten Animationsclip festgelegt.

Animationsclips in der Komponente

Ein Animatorstatuscomputer wird auch generiert, um reibungslose Übergänge zwischen Animationsclips zu verwalten. Standardmäßig verwendet der Zustandscomputer den Beliebigen Zustand , um Übergänge zwischen einem beliebigen Zustand im interaktiven Element zuzulassen.

Im Animator ausgelöste Zustandsvisualisierer werden ebenfalls für jeden Zustand generiert. Die Triggerparameter werden in der Zustandsschnellansicht verwendet, um eine Animation auszulösen.

Unity-Zustandscomputer

Runtime-Einschränkungen

Die Zustandsvisualisierung muss einem Objekt über den Inspector hinzugefügt werden und kann nicht über ein Skript hinzugefügt werden. Die Eigenschaften, die den AnimatorStateMachine/AnimationController ändern, sind in einem Editornamespace (UnityEditor.Animations) enthalten, der beim Erstellen der App entfernt wird.

Verwenden der Zustandsvisualisierer

  1. Erstellen eines Cubes

  2. Interaktives Element anfügen

  3. Anfügen von Zustandsvisualisierer

  4. Wählen Sie Neue Animationsclips generieren aus.

    Generieren neuer Animationsclips

    Anzeigen generierter Animationsclips in Visualisierer- und interaktiven Elementkomponenten

  5. Wählen Sie im Container Fokuszustand die Option Ziel hinzufügen aus.

    Hinzufügen eines Statusvisualisiererziels

  6. Ziehen Sie das aktuelle Spielobjekt in das Zielfeld.

    Festlegen des Statusvisualisiererziels

  7. Öffnen des Foldouts cube animatable Properties

  8. Wählen Sie das Dropdownmenü Animatable-Eigenschaft aus, und wählen Sie Farbe aus.

    Festlegen der Farbe der Zustandsvisualisierer

  9. Wählen Sie Hinzufügen der Color Animatable-Eigenschaft aus.

    Auswählen der animatable-Eigenschaft der Visualizerfarbe

  10. Farbe auswählen

    Auswählen einer Visualisierungsfarbe aus dem Farbrad

  11. Drücken Sie "Wiedergabe", und beobachten Sie die Übergangsfarbe.

    Übergangsfarbänderungsbeispiel mit virtueller Handinteraktion

Eigenschaften, die animiert werden können

Der Hauptzweck der animatable Properties besteht darin, die Einstellung des Animationsclip-Keyframes zu vereinfachen. Wenn ein Benutzer mit dem Unity Animation System vertraut ist und keyframes lieber direkt für die generierten Animationsclips festlegen möchte, kann er einfach keine Animatable-Eigenschaften zu einem Zielobjekt hinzufügen und den Clip im Animationsfenster von Unity (Windows-Animation >> animation) öffnen.

Wenn Sie die Animatable-Eigenschaften für die Animation verwenden, wird der Kurventyp auf EaseInOut festgelegt.

Aktuelle Animatable-Eigenschaften:

Offset skalieren

Die Scale Offset Animatable-Eigenschaft übernimmt die aktuelle Skalierung des Objekts und fügt den definierten Offset hinzu.

Skalieren des Offsets mit virtueller Handinteraktion

Positionsoffset

Die Position Offset Animatable-Eigenschaft übernimmt die aktuelle Position des Objekts und fügt den definierten Offset hinzu.

Positionsoffset mit virtueller Handinteraktion

Color

Die Color Animatable-Eigenschaft stellt die Standard Farbe eines Materials dar, wenn das Material über eine Standard Color-Eigenschaft verfügt. Diese Eigenschaft animiert die material._Color Eigenschaft.

Fokusfarbänderung mit virtueller Handinteraktion

Shaderfarbe

Die Shader Color Animatable-Eigenschaft bezieht sich auf eine Shadereigenschaft vom Typ Color. Für alle Shadereigenschaften ist ein Eigenschaftsname erforderlich. Die folgende GIF veranschaulicht das Animieren einer Shaderfarbeigenschaft namens Fill_Color, die nicht die Standard Materialfarbe ist. Beobachten Sie die sich ändernden Werte im Materialinspektor.

Schattenfarbe mit virtueller Handinteraktion

Shader Float

Die Shader Float Animatable-Eigenschaft bezieht sich auf eine Shadereigenschaft vom Typ float. Für alle Shadereigenschaften ist ein Eigenschaftsname erforderlich. Beachten Sie in der gif unten die sich ändernden Werte im Materialinspektor für die Metallic-Eigenschaft.

Shader float mit virtueller Handinteraktion

Shadervektor

Die Shader Vector Animatable-Eigenschaft bezieht sich auf eine Shadereigenschaft vom Typ Vector4. Für alle Shadereigenschaften ist ein Eigenschaftsname erforderlich. Sehen Sie sich in der gif unten die sich ändernden Werte im Materialinspektor für die Eigenschaft Tiling (Main Tex_ST) an.

Shadervektor mit virtueller Handinteraktion

So finden Sie Namen für abstellbare Shadereigenschaften

  1. Navigieren Sie zur Animation des Fensters >>

  2. Stellen Sie sicher, dass das Objekt mit der Zustandsansicht in der Hierarchie ausgewählt ist.

  3. Wählen Sie einen beliebigen Animationsclip im Animationsfenster aus.

  4. Wählen Sie Eigenschaft hinzufügen aus, und öffnen Sie das Ausklappen des Gitterrenderers.

    Hinzufügen der Animationseigenschaft im Animatorfenster

  5. Diese Liste enthält die Namen aller Animatable-Eigenschaftsnamen.

    Eigenschaften der Mesh-Rendereranimation im Animatorfenster

Weitere Informationen