Freigeben über


Interaktives Element [Experimentell] — MRTK2

Ein vereinfachter zentraler Einstiegspunkt in das 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 neue Funktion in Unity 2019.3 nutzt: Serialisierungsreferenz.

Interaktive Elementprüfung

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 Cyan-Farbe 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, und 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, für den die Zustandseinstellungslogik bereits in BaseInteractiveElementdefiniert ist. Im Folgenden finden Sie eine Liste der aktuellen eingabegesteuerten Kernzustände:

Aktuelle Kernzustände

Nah- und Ferninteraktionskernzustände:

Near Interaction Core-Zustände:

Hauptzustände der Ferninteraktion:

Andere Kernzustände:

Hinzufügen eines Kernzustands über den Inspektor

  1. Navigieren Sie im Inspektor für interaktives Element zu Kernstatus 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 Zustand

  3. Öffnen Sie das Foldout 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 die Enumeration, um eine Liste der verfügbaren Kernzustandsnamen zu erhalten CoreInteractionState .

// 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 Zustandswert 1. Wenn der Zustand deaktiviert ist, ist der Zustandswert 0.
  • Aktiv: Gibt an, ob der Zustand 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 nahezuer Interaktion. Eingaben werden in der Nähe einer Interaktion betrachtet, wenn eine artikulierte Hand direkten Kontakt mit einem anderen Spielobjekt hat, d. h. die Position, in der sich die artikulierte Hand in der Nähe der Position des Spielobjekts im Weltraum befindet.
    • Far: Unterstützung der Ferninteraktion. Die Eingabe wird als Ferninteraktion betrachtet, wenn kein direkter Kontakt mit dem Spielobjekt erforderlich ist. Beispielsweise wird die Eingabe über Controllerstrahl oder Anvisieren als Ferninteraktionseingabe betrachtet.
    • NearAndFar: Umfasst die Unterstützung von Nah- und Ferninteraktionen.
    • Other: Unterstützung für eine zeigerunabhängige Interaktion.
  • 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 ist spezifisch für den Zustand selbst. Jeder Kernzustand verfügt über einen bestimmten Ereigniskonfigurationstyp, der unten in den Abschnitten beschrieben wird, die die einzelnen Kernzustände 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");

Standardmäßiger Status

Der Standardzustand ist für ein interaktives 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 Off festgelegt.

Ein interaktives Element wird mit den Status Default und Focus 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 Zeigen 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 Ferninteraktion betrachtet. Der Fokuszustand ist standardmäßig im interaktiven Element vorhanden.

FokuszustandsverhaltenFokuszustand mit virtueller Handinteraktion

FokuszustandsinspektorFokusstatus 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 Status "Focus Near" wird festgelegt, wenn ein Fokusereignis ausgelöst wird, und der primäre Zeiger ist der Poke-Zeiger, ein Hinweis auf eine Naheinteraktion.

Fokus near State BehaviorFokus near state mit virtueller Handinteraktion

Fokus in der Nähe des ZustandsinspektorsFokus nahe 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 Status "Fokus weit" wird festgelegt, wenn der primäre Zeiger nicht der Poke-Zeiger ist. Beispielsweise werden der Standardstrahlzeiger des Controllers und der GGV-Zeiger (Anvisieren, Geste, Stimme) als Ferninteraktionszeiger betrachtet.

Fokus-FernzustandsverhaltenFokuszustand weit mit virtueller Handinteraktion

Fokus-Fern-Inspektor-Komponente

Abrufen von Fokus-Fernzustandsereignissen

Ereigniskonfigurationstyp für den FocusFar-Status: 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 Touchzustand ist ein Nahezu-Interaktionszustand, der festgelegt wird, wenn eine artikulierte Hand das Objekt direkt berührt. Eine direkte Berührung 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 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 erkennt und NearInteractionTouchabledie Berührung innerhalb eines definierten Bereichs einer Ebene erkennt.

Verhalten des TouchzustandsTouchzustand mit virtueller Handinteraktion

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

Wählen Sie Far State aus.

Der Zustand "Weit auswählen" ist die IMixedRealityPointerHandler angezeigte. Bei diesem Zustand handelt es sich um einen Ferninteraktionszustand, der entfernte Interaktionsklicks (Luft-Tippen) erkennt und durch die Verwendung von Ferninteraktionszeigern wie dem Standardmäßigen Controllerstrahlzeiger oder dem GGV-Zeiger hält. Der Zustand "Weit auswählen" verfügt unter dem Ereigniskonfigurations-Foldout über eine Option namens Global. Wenn Global true ist, wird als IMixedRealityPointerHandler 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 Air-Tap/Select-Geste unabhängig vom Objekt im Fokus ausgeführt wird, legen Sie auf true fest Global .

Wählen Sie Far State Behavior (Verhalten des fernen Zustands) Auswählnen mit virtueller Handinteraktion aus.

Wählen Sie die Komponente "Far State Inspector Select far" (Fernen Zustandsinspektorauswählen) im Inspector aus.

Abrufen von Select Far State-Ereignissen

Ereigniskonfigurationstyp für selectFar State: 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 Zustand "Geklickt" wird standardmäßig durch einen Ferninteraktionsklick (Select Far state) ausgelöst. Dieser Zustand wird intern auf Ein umgeschaltet, ruft das OnClicked-Ereignis auf und wird dann sofort auf "Deaktiviert" umgeschaltet.

Hinweis

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

Verhalten des geklicktenZustands Mit virtuellen Handinteraktionen wurde auf den Zustand geklickt.

Klicken auf ZustandsinspektorKlicken Sie im Inspektor auf zustandskomponente.

Beispiel für den Zustand "Nah- und Fernklick"
Der Angeklickte Zustand kann mithilfe der interactiveElement.TriggerClickedState() -Methode über zusätzliche Einstiegspunkte ausgelöst werden. Wenn ein Benutzer z. B. eine Interaktion nahe der Interaktion möchte, um auch einen Klick auf ein Objekt auszulösen, würde er die TriggerClickedState() -Methode als Listener im Touchzustand hinzufügen.

Nah- und Fernzustand mit virtuellen Handinteraktionen

Get Clicked State-Ereignisse

Ereigniskonfigurationstyp für den Zustand , auf den geklickt wurde: ClickedEvents

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

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

Ein- und Aus-Zustand umschalten

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

ToggleOn und Toggle Off State BehaviorUmschalten und Deaktivieren des Zustandsverhaltens mit virtuellen Handinteraktionen ein- und ausschalten

ToggleOn und Toggle Off State InspectorToggle-Komponente im Inspector

Beispiel für Nah- und Fern-Umschaltzustände
Ähnlich wie beim Zustand Geklickt kann die Einstellung zum Umschalten des Zustands mithilfe der interactiveElement.SetToggleStates() -Methode mehrere Einstiegspunkte aufweisen. Wenn ein Benutzer beispielsweise Toucheingabe 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 Fernschalter mit virtuellen Handinteraktionen

Abrufen von Ein- und Aus-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 Keyword State BehaviorSpeech Schlüsselwort (keyword) mit virtueller Interaktion

Speech Keyword State InspectorSpeech Schlüsselwort (keyword) Komponente im Inspektor

Hinweis

Der Speech-Schlüsselwortzustand wurde im Editor durch Drücken der F5-Taste im obigen GIF ausgelöst. Das Einrichten von Sprachtests im Editor wird in den folgenden Schritten beschrieben.

Registrieren eines Sprachbefehls/Schlüsselworts

  1. Auswählen des MixedRealityToolkit-Spielobjekts

  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 "Add a New Speech Command" (Neuen Sprachbefehl hinzufügen) aus.

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

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

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

  7. Zurück zum Schlüsselwort-Zustandsinspektor für interaktive Elemente, und wählen Sie Schlüsselwort hinzufügen aus.

    Hinzufügen von Schlüsselwort (keyword) zu einer interaktiven Elementkomponente

    Schlüsselwortüberprüfung und -registrierung

  8. Geben Sie den neuen Schlüsselwort (keyword) ein, der soeben im Sprachprofil registriert wurde.

    Eingabe neuer Spracherkennungs-Schlüsselwort (keyword)

Um den Status des Speech-Schlüsselworts im Editor zu testen, drücken Sie den keyCode, der in Schritt 6 (F5) definiert wurde, um das Spracherkennungsereignis Schlüsselwort (keyword) zu simulieren.

Abrufen von Speech-Schlüsselwortzustandsereignissen

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

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 Benutzerdefinierten 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 finden Sie 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. In diesem Beispiel lautet der Statusname 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 Zustandsnamen und der Ereignis-/Empfängerkonvention folgen.

    Tastaturzustandsskripts

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

  4. Fügen Sie dem interaktiven Element den Zustand 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 zum interaktiven Element Der benutzerdefinierte Zustand wird im interaktiven Element erkannt

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

Komprimierbare Schaltfläche

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

Zustandsschnellansicht [Experimentell]

Die Komponente Zustandsschnellansicht fügt Animationen zu einem Objekt hinzu, die auf den in einer verknüpften Interactive Element-Komponente definierten Zuständen basieren. Diese Komponente erstellt Animationsobjekte, platziert sie im Ordner MixedRealityToolkit.Generated und ermöglicht eine 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 Standardzustandsautomat wird mit zugeordneten Parametern und allen Zustandsübergängen generiert. Der Zustandsautomat kann im Animator-Fenster von Unity angezeigt werden.

Zustandsschnellansicht und Unity-Animationssystem

Die Zustandsschnellansicht nutzt derzeit das Unity-Animationssystem.

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

Animationsclips in der Zustandsschnellansichtskomponente

Ein Animatorzustandsautomat wird auch generiert, um reibungslose Übergänge zwischen Animationsclips zu verwalten. Standardmäßig verwendet der Zustandsautomat den Beliebigen Zustand , um Übergänge zwischen einem beliebigen Zustand in Interactive Element zuzulassen.

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

Unity-Zustandscomputer

Laufzeitbeschränkungen

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

Verwenden der Zustandsschnellansicht

  1. Erstellen eines Cubes

  2. Interaktives Element anfügen

  3. Anfügen von Zustandsschnellansichten

  4. Wählen Sie Neue Animationsclips generieren aus.

    Generieren neuer Animationsclips

    Anzeigen generierter Animationsclips in Schnellansichts- und interaktiven Elementkomponenten

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

    Hinzufügen eines Ziels für die Zustandsschnellansicht

  6. Ziehen des aktuellen Spielobjekts in das Zielfeld

    Festlegen des Ziels der Zustandsschnellansicht

  7. Öffnen des Faltungsklapps für cube animierbare Eigenschaften

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

    Festlegen der Farbe der Zustandsschnellansicht

  9. Wählen Sie Add the Color Animatable Property (Color Animatable-Eigenschaft hinzufügen) aus.

    Auswählen der animierbaren Eigenschaft für die Schnellansichtsfarbe

  10. Auswählen einer Farbe

    Auswählen einer Schnellansichtsfarbe aus dem Farbrad

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

    Beispiel für eine Übergangsfarbänderung mit virtueller Handinteraktion

Animierbare Eigenschaften

Der Hauptzweck der animierbaren Eigenschaften besteht darin, die Keyframeeinstellung für Animationsclips zu vereinfachen. Wenn ein Benutzer mit dem Unity-Animationssystem vertraut ist und es vorzieht, Keyframes direkt für die generierten Animationsclips festzulegen, kann er 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 Animationen verwenden, wird der Kurventyp auf EaseInOut festgelegt.

Aktuelle animierbare Eigenschaften:

Skalierungsoffset

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

Skalierungsoffset 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

Farbe

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

Änderung der Fokusfarbe 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. Das folgende GIF zeigt das Animieren einer Shaderfarbeigenschaft namens Fill_Color, die nicht der Standard Materialfarbe entspricht. Beobachten Sie die sich ändernden Werte im Materialinspektor.

Schattierungsfarbe 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. Beobachten Sie im 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. Beachten Sie in der gif-Datei unten die sich ändernden Werte im Materialinspektor für die Eigenschaft Tiling (Main Tex_ST).

Shadervektor mit virtueller Handinteraktion

Gewusst wie: Suchen nach animierbaren Shadereigenschaftennamen

  1. Navigieren Sie zu Fensteranimation >> .

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

  3. Auswählen eines beliebigen Animationsclips im Animationsfenster

  4. Wählen Sie Eigenschaft hinzufügen aus, und öffnen Sie die Gitterrenderer-Ausklappung.

    Hinzufügen der Animationseigenschaft im Animatorfenster

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

    Eigenschaften der Gitterrendereranimation im Fenster

Siehe auch