Interactive Element [Experimental] — MRTK2

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

Interaktives Element ist ein experimentelles Feature, das in Unity 2019.3 unterstützt wird, und es verwendet eine Funktion, die für Unity 2019.3 neu ist: Serialize Reference.

Interaktive Elementprüfung

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

Interactive Element with virtual hand interaction

Kernstaaten

Interactive Element enthält Kernzustände und unterstützt das Hinzufügen von benutzerdefinierten Zuständen. Ein Kernstatus ist ein Zustand, der bereits über die in BaseInteractiveElementder Statuseinstellungslogik definiert ist. Nachfolgend sehen Sie eine Liste der aktuellen eingabegesteuerten Kernzustände:

Aktuelle Kernzustände

Nah- und Ferninteraktionskernzustände:

Nahinteraktionskernzustände:

Far Interaction Core States:

Andere Kernstaaten:

So fügen Sie einen Kernstatus über Inspektor hinzu

  1. Navigieren Sie zum Hinzufügen des Kernstatus im Inspektor für interaktives Element.

    Add a Core State via Inspector

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

    Add a Core State via Inspector with state selected

  3. Öffnen Sie das Foldout für die Ereigniskonfiguration, um die Ereignisse und Eigenschaften anzuzeigen, die dem Zustand zugeordnet sind.

    Add a Core State via Inspector with event configuration

So fügen Sie einen Kernstatus über Skript hinzu

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

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

interactiveElement.AddNewState("SelectFar");

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

Interne Struktur der Staaten

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

  • Name: Der Name des Zustands.
  • Wert: Der Statuswert. Wenn der Zustand aktiviert ist, lautet der Statuswert 1. Wenn der Zustand deaktiviert ist, lautet der Statuswert 0.
  • Aktiv: Gibt an, ob der Status derzeit 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 für die Nahinteraktion. Eingaben werden in der Nähe der Interaktion betrachtet, wenn eine artikulierte Hand direkten Kontakt mit einem anderen Spielobjekt hat, d. h. die Position, an der die artikulierte Hand nah an der Position des Spielobjekts im Weltraum liegt.
    • Far: Unterstützung für die Weitinteraktion. Die Eingabe wird als eine weitverwendte Interaktion betrachtet, wenn der direkte Kontakt mit dem Spielobjekt nicht erforderlich ist. Beispielsweise gilt die Eingabe über Controllerstrahl oder Blick als weit gegriffene Interaktionseingabe.
    • NearAndFar: Umfasst sowohl Nah- als auch Weitinteraktionsunterstützung.
    • Other: Unterstützung für unabhängige Zeigerinteraktionen.
  • Ereigniskonfiguration: Die Ereigniskonfiguration für einen Zustand ist der serialisierte Ereignisprofileintragspunkt.

Alle diese Eigenschaften werden intern im State Manager in Interactive Element enthaltenen Element festgelegt. Verwenden Sie zur Änderung der Zustände die folgenden Hilfsmethoden:

Hilfsmethoden für Zustandseinstellung

// 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 ist spezifisch für den Zustand selbst. Jeder Kernstatus weist einen bestimmten Ereigniskonfigurationstyp auf, der unter 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 Standardstatus ist immer in einem interaktiven Element vorhanden. Dieser Zustand ist nur aktiv, wenn alle anderen Zustände nicht aktiv sind. Wenn ein anderer Zustand aktiv wird, wird der Standardzustand intern deaktiviert.

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

Abrufen von Standardstatusereignissen

Ereigniskonfigurationstyp für den Standardstatus: 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");
});

Fokusstatus

Der Fokuszustand ist ein nah und weit entfernter Interaktionszustand, der als Mixed Reality-Äquivalent zum Zeigen gedacht werden kann. Der Unterscheidungsfaktor zwischen Nah- und Ferninteraktion für den Fokusstatus ist der aktuelle aktive Zeigertyp. Wenn der Zeigertyp für den Fokusstatus der Poke Pointer ist, wird die Interaktion in der Nähe der Interaktion betrachtet. Wenn der primäre Zeiger nicht der Poke Pointer ist, wird die Interaktion als weit betrachtet. Der Fokusstatus ist standardmäßig im interaktiven Element vorhanden.

Verhalten des FokuszustandsFocus state with virtual hand interaction

FokusstatusprüfungFocus state in the Inpsector

Abrufen von Fokusstatusereignissen

Ereigniskonfigurationstyp für den Fokusstatus: 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");
});

Focus Near vs Focus Far Behavior

Focus near and far with virtual hand interaction

Fokus in der Nähe des Zustands

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

Fokus in der Nähe des ZustandsverhaltensFocus near state with virtual hand interaction

Fokus in der Nähe des StaatsinspektorsFocus near component in the Inspector

Abrufen von FocusNear-Statusereignissen

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. Der Standardmäßige Controller-Raypointer und der GGV-Zeiger (Gaze, Gesture, Voice) gelten beispielsweise als Weitinteraktionszeiger.

Verhalten des FokusstatusFocus state far with virtual hand interaction

Fokus Far State InspectorFocus far component in the Inspector

Abrufen von Fokus-Fernstatusereignissen

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");
});

Touchstatus

Der Touchzustand ist ein nahes Interaktionszustand, der festgelegt wird, wenn eine artikulierte Hand das Objekt direkt berührt. Eine direkte Toucheingabe bedeutet, dass der Zeigefinger der artikulierten Hand sehr nah an der Weltposition des Objekts liegt. Standardmäßig wird eine NearInteractionTouchableVolume Komponente an das Objekt angefügt, wenn der Touchstatus der Statusliste hinzugefügt wird. Das Vorhandensein einer Komponente oder NearInteractionTouchable einer NearInteractionTouchableVolume Komponente ist erforderlich, um Touchereignisse zu erkennen. Der Unterschied zwischen NearInteractionTouchableVolume und NearInteractionTouchable ist, dass NearInteractionTouchableVolume eine Berührung basierend auf dem Kollidieren des Objekts erkannt wird und NearInteractionTouchabledie Berührung innerhalb eines definierten Bereichs einer Ebene erkennt.

Verhalten des TouchzustandsTouch state with virtual hand interaction

Touch State InspectorTouch state component in the Inspector

Abrufen von Touchstatusereignissen

Ereigniskonfigurationstyp für den Touchstatus: 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");
});

Fernstatus auswählen

Der Status "Weit auswählen" ist die IMixedRealityPointerHandler Oberfläche. Dieser Zustand ist ein weit entfernter Interaktionszustand, der fernen Interaktionsklick (Luft tippen) erkennt und durch die Verwendung von Weitinteraktionszeigern wie dem Standardcontroller-Raypointer oder dem GGV-Zeiger hält. Der Status "Select Far" verfügt über eine Option unter dem Namen "Ereigniskonfiguration" mit dem Namen " GlobalSelect Far". Ist Global "true", wird dies 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 Luftkipp-/Auswahlgeste ausgeführt wird, unabhängig vom Objekt im Fokus, legen Sie auf "true" fest Global .

Verhalten des Fernzustands auswählenSelect far with virtual hand interaction

Far State Inspector auswählenSelect far component in the Inspector

Abrufen von Fernstatusereignissen

Ereigniskonfigurationstyp für den SelectFar-Status: 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 Geklickte Zustand wird standardmäßig durch einen fernen Interaktionsklick (Far-Zustand auswählen) ausgelöst. Dieser Zustand wird intern aktiviert, ruft das OnClicked-Ereignis auf und wird dann sofort deaktiviert.

Hinweis

Das visuelle Feedback im Inspektor basierend auf statusbezogener Aktivität ist für den Geklickten Zustand nicht vorhanden, da es eingeschaltet und dann sofort deaktiviert wird.

Verhalten des geklickten ZustandsClicked state with virtual hand interactions

Geklickter ZustandsinspektorClick state component in the Inspector

Beispiel für nah und weit geklickt
Der geklickte Zustand kann mithilfe der interactiveElement.TriggerClickedState() Methode durch zusätzliche Einstiegspunkte ausgelöst werden. Wenn ein Benutzer beispielsweise eine nahe Interaktionseingabe zum Auslösen eines Klicks auf ein Objekt wünscht, würde er die TriggerClickedState() Methode als Listener im Touchzustand hinzufügen.

Near and far state with virtual hand interactions

Abrufen von Klickstatusereignissen

Ereigniskonfigurationstyp für den Geklickten Zustand: ClickedEvents

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

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

Ein- und Umschalten des Zustands "Aus"

Die Ein- und Umschaltungszustände "Ein" und "Aus" sind ein Paar und müssen beide für das Umschaltverhalten vorhanden sein. Standardmäßig werden die Zustände "Ein" und "Ein- und Ausschalten" durch eine lange Interaktionsklick ausgelöst (Status "Weit auswählen"). Standardmäßig ist der Status "Aus" am Anfang aktiv, d. h. der Umschalter wird auf "Deaktiviert" initialisiert. Wenn ein Benutzer den Status "Ein" am Start aktiv sein möchte, wird der Status "Ein" auf "True" festgelegt IsSelectedOnStart .

Umschalten Von Zustandsverhalten und Umschalten des ZustandsToggle on and off with virtual hand interactions

UmschaltEn und Umschalten des ZustandsinspektorsToggle component in the Inspector

Near and Far Toggle States(Beispiel)
Ähnlich wie beim Klickstatus kann die Umschaltfläche mehrere Einstiegspunkte mit der interactiveElement.SetToggleStates() Methode aufweisen. Wenn ein Benutzer beispielsweise die Toucheingabe als zusätzlichen Einstiegspunkt zum Festlegen der Umschaltzustände wünscht, fügen sie die SetToggleStates() Methode zu einem der Ereignisse im Touchzustand hinzu.

Near and far toggle with virtual hand interactions

Ein- und Umschalten von Zustandsereignissen

Ereigniskonfigurationstyp für den ToggleOn-Status: 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");
});

Sprachschlüsselwortstatus

Der Sprachschlüsselwortstatus lauscht auf die schlüsselwörter, die im Mixed Reality Sprachprofil definiert sind. Jedes neue Schlüsselwort MUSS vor der Laufzeit im Sprachbefehlsprofil registriert werden (schritte unten).

Verhalten des SprachschlüsselwortzustandsSpeech keyword with virtual interaction

SprachschlüsselwortstatusprüfungSpeech keyword component in the Inspector

Hinweis

Der Sprachschlüsselwortstatus wurde im Editor ausgelöst, indem die F5-TASTE im gif oben gedrückt wird. Das Einrichten von Editortests für Sprache wird in den folgenden Schritten beschrieben.

So registrieren Sie einen Sprachbefehl/Schlüsselwort

  1. Auswählen des MixedRealityToolkit-Spielobjekts

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

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

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

    Speech keyword profile in the MRTK game object

  5. Wählen Sie "Neuen Sprachbefehl hinzufügen" aus.

    Adding a new speech keyword in the MRTK profile

  6. Geben Sie das neue Schlüsselwort ein. Optional: Ändern Sie den KeyCode in F5 (oder einen anderen KeyCode), um tests im Editor zuzulassen.

    Configuring speech keyword in the MRTK profile

  7. Zurück zum Inspektor für den Sprachstatus des Interaktiven Elements und wählen Sie "Schlüsselwort hinzufügen" aus.

    Adding keyword to interactive element component

    Keyword validation and registration

  8. Geben Sie das neue Schlüsselwort ein, das gerade im Sprachprofil registriert wurde

    Entering new speech keyword

Um den Sprachschlüsselwortstatus im Editor zu testen, drücken Sie den KeyCode, der in Schritt 6 (F5) definiert wurde, um das erkannte Ereignis des Sprachschlüsselworts zu simulieren.

Abrufen von Sprachwortstatusereignissen

Ereigniskonfigurationstyp für den SpeechKeyword-Status: 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

So erstellen Sie einen benutzerdefinierten Zustand über Inspektor

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

  1. Navigieren Sie zum Erstellen des benutzerdefinierten Zustands im Inspektor für interaktives Element.

    Creating a custom state

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

    Entering the name of a new custom state

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

    Add custom state to state list

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

    New state shown in the interactive element component

Erstellen eines benutzerdefinierten Zustands über 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 mit dem Namen Tastatur finden Sie hier: MRTK\SDK\Experimental\InteractiveElement\Examples\Scripts\CustomStateExample

Die folgenden Schritte führen Sie durch ein vorhandenes Beispiel zum Erstellen einer benutzerdefinierten Ereigniskonfiguration und Empfängerdateien.

  1. Denken Sie an einen Statusnamen. Dieser Name muss eindeutig sein und kann nicht mit den vorhandenen Kernzuständen übereinstimmen. Für die Zwecke dieses Beispiels wird der Statusname als Tastatur verwendet.

  2. Erstellen Sie zwei CS-Dateien namens "Statusname" + "Empfänger" und Statusname + "Ereignisse". Die Benennung dieser Dateien wird intern berücksichtigt und muss der Statusname + Ereignis/Empfänger-Konvention folgen.

    Keyboard state scripts

  3. Weitere Informationen zu Dateiinhalten finden Sie in den Dateien "KeyboardEvents.cs" und "KeyboardReceiver.cs". Neue Ereigniskonfigurationsklassen müssen erben BaseInteractionEventConfiguration und neue Ereignisempfängerklassen müssen von .BaseEventReceiver Beispiele für die Statuseinstellung für den Tastaturstatus befinden sich in der CustomStateSettingExample.cs Datei.

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

    Adding custom state to interactive elementCustom state recognized in the interactive element

  5. Weitere Beispiele für Ereigniskonfigurations- und Ereignisempfängerdateien finden Sie in 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

Example scene with Interactive Element and State Visualizer

Komprimierbare Schaltfläche

Die Beispielszene enthält Präfabs namens CompressableButton und CompressableButtonToggle, diese Prefabs spiegeln das Verhalten der PressableButtonHoloLens2 Schaltflächen wider, die mithilfe des interaktiven Elements und der State Visualizer erstellt werden. Die CompressableButton Komponente ist derzeit eine Kombination aus PressableButton + PressableButtonHoloLens2BaseInteractiveElementeiner Basisklasse.

State Visualizer [Experimental]

Die State Visualizer-Komponente fügt einem Objekt Animationen basierend auf den in einer verknüpften interaktiven Elementkomponente definierten Zuständen hinzu. Diese Komponente erstellt Animationsressourcen, platziert sie im Ordner MixedRealityToolkit.Generiert und ermöglicht die vereinfachte Einstellung des Animations-Keyframes durch Hinzufügen von Animatable-Eigenschaften zu einem Zielspielobjekt. Um Animationsübergänge zwischen Zuständen zu aktivieren, wird ein AnimatorController-Objekt erstellt, und ein Standardzustandscomputer wird mit zugeordneten Parametern und allen Zustandsübergängen generiert. Der Zustandscomputer kann im Animatorfenster von Unity angezeigt werden.

State Visualizer und Unity Animation System

Der State Visualizer nutzt derzeit das Unity Animation System.

Wenn die Schaltfläche "Neue Animationclips generieren" in der Statusansicht gedrückt wird, werden neue Animationsclipressourcen basierend auf den Statusnamen in Interactive Element generiert und im MixedRealityToolkit.Generierten Ordner platziert. Die Animation Clip-Eigenschaft in jedem Statuscontainer wird auf den zugeordneten Animationsclip festgelegt.

Animation clips in state visualizer component

Ein Animator-Zustandscomputer wird auch generiert, um reibungslose Übergänge zwischen Animationsclips zu verwalten. Standardmäßig verwendet der Zustandscomputer den Beliebigen Zustand, um Übergänge zwischen jedem Zustand in Interactive Element zu ermöglichen.

Zustandsvisualisierer, die im Animator ausgelöst werden, werden auch für jeden Zustand generiert, die Triggerparameter werden in der Zustandsvisualisierer verwendet, um eine Animation auszulösen.

Unity state machine

Runtime-Einschränkungen

Der Statusvisualisierer muss einem Objekt über den Inspektor hinzugefügt werden und kann nicht über Skript hinzugefügt werden. Die Eigenschaften, die die AnimatorStateMachine/AnimationController ändern, sind in einem Editor-Namespace (UnityEditor.Animations) enthalten, der entfernt wird, wenn die App erstellt wird.

So wird's gemacht: Verwenden des Zustandsvisualisierer

  1. Erstellen eines Cubes

  2. Interaktives Element anfügen

  3. Anfügen von Zustandsvisualisierer

  4. Wählen Sie "Neue Animationsclips generieren" aus.

    Generating new animation clips

    Showing generated animation clips in visualizer and interactive element components

  5. Wählen Sie im Fokusstatuscontainer die Option "Ziel hinzufügen" aus.

    Adding state visualizer target

  6. Ziehen Sie das aktuelle Spielobjekt in das Zielfeld

    Setting state visualizer target

  7. Öffnen des Cube-Animatable-Eigenschaften-Faltouts

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

    Setting state visualizer color

  9. Wählen Sie "Farbe Animatable"-Eigenschaft aus.

    Selecting the visualizer color animatable property

  10. Wählen Sie eine Farbe aus.

    Choosing a visualizer color from color wheel

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

    Transitional color change example with virtual hand interaction

Eigenschaften, die animiert werden können

Der primäre Zweck der Animatable-Eigenschaften besteht darin, die Einstellung der Animationsclip-Keyframeeinstellung zu vereinfachen. Wenn ein Benutzer mit dem Unity Animation System vertraut ist und keyframes auf den generierten Animationsclips direkt festlegen möchte, können sie einfach keine Animatable-Eigenschaften zu einem Zielobjekt hinzufügen und den Clip im Animationsfenster von Unity (Windows >> Animation) öffnen.

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

Aktuelle Animatable-Eigenschaften:

Skalierungssatz

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

Scale offset with virtual hand interaction

Position Offset

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

Position offset with virtual hand interaction

Color

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

Focus color change with virtual hand interaction

Shaderfarbe

Die Shader Color Animatable-Eigenschaft bezieht sich auf eine Shadereigenschaft von Typfarbe. Für alle Shadereigenschaften ist ein Eigenschaftsname erforderlich. Im folgenden Gif wird die Animierung einer Shaderfarbe mit dem Namen Fill_Color veranschaulicht, die nicht die Hauptmaterialfarbe ist. Beobachten Sie die ändernden Werte im Materialinspektor.

Shade color with virtual hand interaction

Shader Float

Die Shader Float Animatable-Eigenschaft bezieht sich auf eine Shadereigenschaft des Typs Float. Für alle Shadereigenschaften ist ein Eigenschaftsname erforderlich. Beobachten Sie im folgenden Gif die geänderten Werte im Materialinspektor für die Metallic-Eigenschaft.

Shader float with virtual hand interaction

Shadervektor

Die Shader Vector Animatable-Eigenschaft bezieht sich auf eine Shadereigenschaft vom Typ Vector4. Für alle Shadereigenschaften ist ein Eigenschaftsname erforderlich. Beobachten Sie im folgenden Gif die geänderten Werte im Materialinspektor für die Tiling -Eigenschaft (Main Tex_ST).

Shader vector with virtual hand interaction

So finden Sie Die Namen der Animatable Shader-Eigenschaft

  1. Navigieren zur Fensteranimation >>

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

  3. Auswählen eines Animationsclips im Animationsfenster

  4. Wählen Sie "Eigenschaft hinzufügen" aus, öffnen Sie das Mesh Renderer-Foldout

    Adding animation property in the Animator window

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

    Mesh renderer animation properties in the Animator window

Siehe auch