Interaktivt element [experimentellt] – MRTK2
En förenklad centraliserad startpunkt för MRTK-indatasystemet. Innehåller tillståndshanteringsmetoder, händelsehantering och tillståndsinställningslogik för Core Interaction States.
Interactive Element är en experimentell funktion som stöds i Unity 2019.3 och senare eftersom den använder en funktion som är ny i Unity 2019.3: Serialisera referens.
Interaktiv elementkontroll
Under uppspelningsläget ger inspektören interaktivt element visuell feedback som anger om det aktuella tillståndet är aktivt eller inte. Om ett tillstånd är aktivt markeras det med en cyanfärg. Om tillståndet inte är aktivt ändras inte färgen. Talen bredvid tillstånden i inspektören är tillståndsvärdena, om tillståndet är aktivt är värdet 1, om tillståndet inte är aktivt är värdet 0.
Kärntillstånd
Interaktivt element innehåller kärntillstånd och stöder tillägg av anpassade tillstånd. Ett kärntillstånd är ett tillstånd som redan har tillståndsinställningslogik definierad i BaseInteractiveElement
. Följande är en lista över de aktuella indatadrivna kärntillstånden:
Aktuella kärntillstånd
Grundläggande tillstånd för nära och fjärran interaktion:
Kärntillstånd för nära interaktion:
Kärntillstånd för långt interaktion:
Andra kärntillstånd:
Så här lägger du till ett kärntillstånd via Inspector
Gå till Lägg till kärntillstånd i kontrollanten för interaktivt element.
Välj knappen Välj tillstånd för att välja det kärntillstånd som ska läggas till. Tillstånden i menyn sorteras efter interaktionstyp.
Öppna vikningen Händelsekonfiguration för att visa de händelser och egenskaper som är associerade med tillståndet.
Så här lägger du till ett kärntillstånd via skript
AddNewState(stateName)
Använd metoden för att lägga till ett kärntillstånd. Använd uppräkningen för en lista över tillgängliga kärntillståndsnamn CoreInteractionState
.
// Add by name or add by CoreInteractionState enum to string
interactiveElement.AddNewState("SelectFar");
interactiveElement.AddNewState(CoreInteractionState.SelectFar.ToString());
Tillstånd intern struktur
Tillstånden i Interaktivt element är av typen InteractionState
. En InteractionState
innehåller följande egenskaper:
- Namn: Namnet på tillståndet.
- Värde: Tillståndsvärdet. Om tillståndet är aktiverat är tillståndsvärdet 1. Om tillståndet är inaktiverat är tillståndsvärdet 0.
- Aktiv: Om tillståndet för närvarande är aktivt eller inte. Värdet för egenskapen Aktiv är sant när tillståndet är aktiverat, falskt om tillståndet är inaktiverat.
- Interaktionstyp: Interaktionstypen för ett tillstånd är den typ av interaktion som ett tillstånd är avsett för.
None
: Stöder inte någon form av indatainteraktion.Near
: Stöd för nära interaktion. Indata anses vara nära interaktion när en artikulerad hand har direkt kontakt med ett annat spelobjekt, dvs. positionen den ledade handen är nära positionen för spelobjektet i världsrymden.Far
: Stöd för långt interaktion. Indata anses vara långt interaktion när direkt kontakt med spelobjektet inte krävs. Indata via styrenhetens stråle eller blick anses till exempel vara långt interaktionsindata.NearAndFar
: Omfattar både nära och långt interaktionsstöd.Other
: Stöd för pekaroberoende interaktion.
- Händelsekonfiguration: Händelsekonfigurationen för ett tillstånd är startpunkten för den serialiserade händelseprofilen.
Alla dessa egenskaper anges internt i som State Manager
finns i Interaktivt element. Om du vill ändra tillstånd använder du följande hjälpmetoder:
Hjälpmetoder för tillståndsinställning
// 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");
Att hämta händelsekonfigurationen för ett tillstånd är specifikt för själva tillståndet. Varje kärntillstånd har en specifik händelsekonfigurationstyp som beskrivs nedan under avsnitten som beskriver varje kärntillstånd.
Här är ett generaliserat exempel på hur du hämtar ett tillstånds händelsekonfiguration:
// 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");
Standardtillstånd
Standardtillståndet finns alltid på ett interaktivt element. Det här tillståndet är endast aktivt när alla andra tillstånd inte är aktiva. Om något annat tillstånd blir aktivt kommer standardtillståndet att inaktiveras internt.
Ett interaktivt element initieras med standard- och fokustillstånden som finns i tillståndslistan. Standardtillståndet måste alltid finnas i tillståndslistan.
Hämta standardtillståndshändelser
Händelsekonfigurationstyp för standardtillståndet: 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");
});
Fokustillstånd
Fokustillståndet är ett nära och långt interaktionstillstånd som kan betraktas som den mixade verkligheten som motsvarar hovring. Den särskiljande faktorn mellan nära och långt interaktion för fokustillståndet är den aktuella aktiva pekartypen. Om pekartypen för fokustillståndet är Poke Pointer anses interaktionen vara nära interaktion. Om den primära pekaren inte är poke-pekaren anses interaktionen vara långt interaktion. Fokustillståndet finns som standard i Interaktivt element.
Fokustillstånd beteende
Hämta händelser för fokustillstånd
Händelsekonfigurationstyp för fokustillstånd: 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
Fokus nära tillstånd
Läget Fokus nära anges när en fokushändelse aktiveras och den primära pekaren är poke-pekaren, en indikation på nära interaktion.
Fokus nära tillstånd beteende
Fokus nära tillståndsinspektören
Hämta FocusNear State Events
Händelsekonfigurationstyp för FocusNear-tillståndet: 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, långt tillstånd
Tillståndet Fokus långt anges när den primära pekaren inte är Poke-pekaren. Till exempel anses standardkontrollantens strålpekare och GGV-pekaren (Blick, Gest, Röst) vara långt interaktionspekare.
Focus Far State Behavior
Focus Far State Inspector
Få fokus – händelser med långt tillstånd
Händelsekonfigurationstyp för FocusFar State: 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");
});
Pektillstånd
Touch-tillståndet är ett nära interaktionstillstånd som anges när en artikulerad hand rör vid objektet direkt. En direkt beröring innebär att den ledade handens pekfinger ligger mycket nära objektets världsposition. Som standard är en NearInteractionTouchableVolume
komponent kopplad till objektet om Touch-tillståndet läggs till i tillståndslistan. Förekomsten av en NearInteractionTouchableVolume
eller NearInteractionTouchable
-komponent krävs för att identifiera Touch-händelser. Skillnaden mellan NearInteractionTouchableVolume
och är att NearInteractionTouchableVolume
identifierar en touch baserat på objektets kolliderare och NearInteractionTouchable
identifierar beröring inom ett definierat område NearInteractionTouchable
i ett plan.
Touch State Behavior)
Touch State Inspector
Hämta Touch State-händelser
Händelsekonfigurationstyp för Touch State: 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");
});
Välj långt tillstånd
Tillståndet Välj långt är det IMixedRealityPointerHandler
som visas. Det här tillståndet är ett långt interaktionstillstånd som identifierar långt interaktionstryck (lufttryckning) och som håller sig genom användning av långt interaktionspekare, till exempel standardkontrollantens strålpekare eller GGV-pekaren. Tillståndet Välj långt har ett alternativ under utfällbar händelsekonfiguration med namnet Global
. Om Global
är sant IMixedRealityPointerHandler
registreras som en global indatahanterare. Fokus på ett objekt krävs inte för att utlösa indatasystemhändelser om en hanterare registreras som global. Om en användare till exempel vill veta när gesten air-tap/select utförs oavsett vilket objekt som är i fokus, anger du Global
till sant.
Välj Beteende för långt tillstånd
Välj Inspektör för långt tillstånd
Hämta Select Far State Events
Händelsekonfigurationstyp för SelectFar-tillstånd: 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");
});
Klickat på tillstånd
Det klickade tillståndet utlöses av ett långt interaktionsklicka (välj långt tillstånd) som standard. Det här tillståndet är internt aktiverat, anropar händelsen OnClicked och stängs sedan omedelbart av.
Anteckning
Den visuella feedbacken i inspektören baserat på tillståndsaktiviteten finns inte för det klickade tillståndet eftersom det är aktiverat och sedan inaktiverat omedelbart.
Klickade
Klickade på Tillståndskontroll
Exempel på tillstånd som klickats nära och långt
Det klickade tillståndet kan utlösas via ytterligare startpunkter med hjälp av interactiveElement.TriggerClickedState()
metoden . Om en användare till exempel vill att en nära interaktionstouch ska utlösa ett klick på ett objekt, lägger de till TriggerClickedState()
metoden som en lyssnare i pektillståndet.
Hämta klickade tillståndshändelser
Händelsekonfigurationstyp för klickat tillstånd: ClickedEvents
ClickedEvents clickedEvent = interactiveElement.GetStateEvents<ClickedEvents>("Clicked");
clickedEvent.OnClicked.AddListener(() =>
{
Debug.Log($"{gameObject.name} Clicked");
});
Växla på- och växlingsläge
Växlingslägena På och Växla av är ett par och båda måste finnas för växlingsbeteende. Som standard utlöses lägena Växla på och Växla av genom ett långt interaktionsklick (Välj långt tillstånd). Som standard är växlingsläget Av aktivt vid start, vilket innebär att växlingsknappen initieras till av. Om en användare vill att läget Växla på ska vara aktivt vid start, anger IsSelectedOnStart
du värdet true i läget Växla på.
Växla På och Växla från tillståndsbeteende
Växla på och växla från
Exempel på växlingstillstånd nära och långt
På samma sätt som med inställningen Klickat tillstånd kan växlingslägesinställningen ha flera startpunkter med hjälp av interactiveElement.SetToggleStates()
metoden . Om en användare till exempel vill att touch ska vara en ytterligare startpunkt för att ange växlingslägen lägger de till SetToggleStates()
metoden till en av händelserna i Touch-tillståndet.
Aktivera och inaktivera tillståndshändelser
Händelsekonfigurationstyp för växlingsläge: ToggleOnEvents
Händelsekonfigurationstyp för växlingsläge: 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");
});
Nyckelordstillstånd för tal
Nyckelordstillståndet tal lyssnar efter nyckelorden som definierats i Mixed Reality Speech-profilen. Alla nya nyckelord måste registreras i talkommandoprofilen före körning (steg nedan).
Speech Keyword State Behavior
Nyckelordskomponent för Speech Keyword State Inspector
Anteckning
Nyckelordstillståndet tal utlöstes i redigeraren genom att trycka på F5-tangenten i gif-filen ovan. Konfigurering i redigeringstestning för tal beskrivs stegen nedan.
Registrera ett talkommando/nyckelord
Välj spelobjektet MixedRealityToolkit
Välj Kopiera och anpassa den aktuella profilen
Gå till avsnittet Indata och välj Klona för att aktivera ändring av indataprofilen
Rulla ned till avsnittet Tal i indataprofilen och klona talprofilen
Välj Lägg till ett nytt talkommando
Ange det nya nyckelordet. Valfritt: Ändra KeyCode till F5 (eller en annan KeyCode) för att tillåta testning i redigeraren.
Gå tillbaka till inspektören för nyckelordstillstånd för interaktivt element och välj Lägg till nyckelord
Ange det nya nyckelordet som just registrerades i talprofilen
Om du vill testa tillståndet för talnyckelordet i redigeraren trycker du på nyckelkoden som definierades i steg 6 (F5) för att simulera den identifierade händelsen för talnyckelordet.
Hämta händelser för nyckelordstillstånd för tal
Händelsekonfigurationstyp för SpeechKeyword-tillståndet: 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");
});
Anpassade tillstånd
Så här skapar du ett anpassat tillstånd via Inspector
Det anpassade tillstånd som skapas via Inspector initieras med standardkonfigurationen för tillståndshändelser. Standardhändelsekonfigurationen för ett anpassat tillstånd är av typen StateEvents
och innehåller händelserna OnStateOn och OnStateOff.
Gå till Skapa anpassat tillstånd i kontrollanten för interaktivt element.
Ange namnet på det nya tillståndet. Det här namnet måste vara unikt och får inte vara samma som de befintliga kärntillstånden.
Välj Ange tillståndsnamn att lägga till i tillståndslistan.
Det här anpassade tillståndet initieras med standardhändelsekonfigurationen
StateEvents
OnStateOn
som innehåller händelserna ochOnStateOff
. Information om hur du skapar en anpassad händelsekonfiguration för ett nytt tillstånd finns i: Skapa ett anpassat tillstånd med en anpassad händelsekonfiguration.
Så här skapar du ett anpassat tillstånd via 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");
});
Skapa ett anpassat tillstånd med en anpassad händelsekonfiguration
Exempelfiler för ett anpassat tillstånd med namnet Tangentbord finns här: MRTK\SDK\Experimental\InteractiveElement\Examples\Scripts\CustomStateExample
Följande steg går igenom ett befintligt exempel på hur du skapar en händelsekonfiguration för anpassat tillstånd och mottagarfiler.
Tänk på ett statsnamn. Det här namnet måste vara unikt och får inte vara samma som de befintliga kärntillstånden. I det här exemplet kommer tillståndsnamnet att vara Tangentbord.
Skapa två .cs-filer med namnet state name + "Receiver" och state name + "Events". Namngivning av dessa filer beaktas internt och måste följa tillståndsnamnet + händelse-/mottagarkonventionen.
Mer information om filinnehåll finns i filerna KeyboardEvents.cs och KeyboardReceiver.cs. Nya händelsekonfigurationsklasser måste ärva från
BaseInteractionEventConfiguration
och nya händelsemottagareklasser måste ärva frånBaseEventReceiver
. Exempel på tillståndsinställning för tangentbordstillstånd finns iCustomStateSettingExample.cs
filen.Lägg till tillståndet i Interaktivt element med tillståndsnamnet. Tillståndsnamnet identifieras om det finns filer för händelsekonfiguration och händelsemottagare. Egenskaperna i den anpassade händelsekonfigurationsfilen bör visas i inspektören.
Fler exempel på händelsekonfigurations- och händelsemottagarfiler finns i filerna på dessa sökvägar:
- MRTK\SDK\Experimental\InteractiveElement\InteractiveElement\Events\EventConfigurations
- MRTK\SDK\Experimental\InteractiveElement\InteractiveElement\Events\EventReceivers
Exempelscen
Exempelscenen för Interactive Element + State Visualizer finns här: MRTK\SDK\Experimental\InteractiveElement\Examples\InteractiveElementExampleScene.unity
Komprimerad knapp
Exempelscenen innehåller prefabs med namnet CompressableButton
och CompressableButtonToggle
, dessa prefabs speglar beteendet för knapparna PressableButtonHoloLens2
, som konstrueras med hjälp av Interactive Element och State Visualizer.
Komponenten CompressableButton
är för närvarande en kombination avPressableButtonHoloLens2
PressableButton
+ med BaseInteractiveElement
som basklass.
Tillståndsvisualiserare [experimentell]
Komponenten State Visualizer lägger till animeringar i ett objekt baserat på tillstånden som definierats i en länkad interactive element-komponent. Den här komponenten skapar animeringstillgångar, placerar dem i mappen MixedRealityToolkit.Generated och aktiverar förenklad animeringsnyckelram genom att lägga till animatable-egenskaper i ett målspelsobjekt. Om du vill aktivera animeringsövergångar mellan tillstånd skapas en Animator Controller-tillgång och en standardtillståndsdator genereras med associerade parametrar och eventuella tillståndsövergångar. Tillståndsdatorn kan visas i Unitys animatörsfönster.
State Visualizer och Unity Animation System
Tillståndsvisualiseraren använder för närvarande Unity Animation System.
När knappen Skapa nya animeringsklipp i Tillståndsvisualiseraren trycks ned genereras nya animeringsklippstillgångar baserat på tillståndsnamnen i Interaktivt element och placeras i mappen MixedRealityToolkit.Generated. Egenskapen Animeringsklipp i varje tillståndscontainer är inställd på det associerade animeringsklippet.
En Animator State Machine genereras också för att hantera smidiga övergångar mellan animeringsklipp. Som standard använder tillståndsdatorn Alla tillstånd för att tillåta övergångar mellan alla tillstånd i interaktivt element.
Tillståndsvisualiserare som utlöses i animatören genereras också för varje tillstånd. Utlösarparametrarna används i Tillståndsvisualiseraren för att utlösa en animering.
Körningsbegränsningar
Tillståndsvisualiseraren måste läggas till i ett objekt via Inspector och kan inte läggas till via skript. Egenskaperna som ändrar AnimatorStateMachine/AnimationController finns i ett redigeringsnamnområde (UnityEditor.Animations
) som tas bort när appen skapas.
Så här använder du tillståndsvisualiseraren
Skapa en kub
Koppla interaktivt element
Bifoga tillståndsvisualiserare
Välj Generera nya animeringsklipp
I containern Fokustillstånd väljer du Lägg till mål
Dra det aktuella spelobjektet till målfältet
Öppna utfällbara kubegenskaper
Välj den animatable-egenskapens nedrullningsbara meny och välj Färg
Välj Lägg till egenskapen Color Animatable
Välj en färg
Tryck på spela och observera övergångsfärgen ändras
Animatable-egenskaper
Det primära syftet med animatable-egenskaperna är att förenkla inställningen för animeringsklippets nyckelbildruta. Om en användare är bekant med Unity Animation System och föredrar att ange nyckelrutor direkt på de genererade animeringsklippen kan de helt enkelt inte lägga till animatable-egenskaper i ett målobjekt och öppna klippet i Unitys animeringsfönster (Windows > Animation > Animation).
Om du använder animatable-egenskaperna för animering anges kurvtypen till EaseInOut.
Aktuella animatable-egenskaper:
Skalningsförskjutning
Egenskapen Skalningsförskjutning animatable tar objektets aktuella skala och lägger till den definierade förskjutningen.
Positionsförskjutning
Egenskapen Animatable för positionsförskjutning tar objektets aktuella position och lägger till den definierade förskjutningen.
Färg
Egenskapen Color Animatable representerar huvudfärgen för ett material om materialet har en huvudfärgegenskap. Den här egenskapen animerar material._Color
egenskapen.
Skuggningsfärg
Egenskapen Shader Color Animatable refererar till en skuggningsegenskap av typen färg. Ett egenskapsnamn krävs för alla skuggningsegenskaper. Gif-filen nedan visar hur du animerar en skuggningsfärgegenskap med namnet Fill_Color som inte är den huvudsakliga materialfärgen. Observera de ändrade värdena i materialkontrollen.
Shader Float
Egenskapen Shader Float Animatable refererar till en shader-egenskap av typen float. Ett egenskapsnamn krävs för alla skuggningsegenskaper. Observera de ändrade värdena i materialinspektören för egenskapen Metallic i gif-filen nedan.
Skuggningsvektor
Egenskapen Shader Vector Animatable refererar till en shader-egenskap av typen Vector4. Ett egenskapsnamn krävs för alla skuggningsegenskaper. Observera de ändrade värdena i egenskapen Tiling (Main Tex_ST) i gif-filen nedan.
Så här hittar du egenskapsnamn för Animatable Shader
Navigera till animering av > fönster >
Kontrollera att objektet med Tillståndsvisualiseraren är markerat i hierarkin
Välj ett animeringsklipp i animeringsfönstret
Välj Lägg till egenskap, öppna mesh-återgivningsutvikningen
Den här listan innehåller namnen på alla animatable-egenskapsnamn