Kezelhető

Kezelhető

Az összetevő egy mindent egy tároló, amely minden objektumot könnyen kezelhető és rugalmasan reagál a Interactable bemenetre. Interactable Az interakciók minden bemenethez használhatók, beleértve az érintést, a kéz sugarait, a beszédet stb., és ezeket az interakciókat eseményekbe és vizuális témaválaszokbe tölcsérékként funktálják. Ez az összetevő egyszerű módja a gomboknak, a fókuszt ható objektumok színének módosítása stb.

A Kezelhetők konfigurálása

Az összetevő a konfiguráció három elsődleges szakaszát teszi lehetővé:

  1. Általános bemeneti konfiguráció
  2. Több GameObjectre célzott vizuális témák
  3. Eseménykezelők

Általános bemeneti beállítások

Általános interakciós Gépház

Állapotok

A States egy ScriptableObject paraméter, amely meghatározza az interakciós fázisokat , például a lenyomást vagy a megfigyeltet a kezelhető profilokhoz és a vizuálistémákhoz.

A DefaultInteractableStates (Assets/MRTK/SDK/Features/UX/Interactable/States/DefaultInteractableStates.asset) az MRTK gyári csomagját tartalmazza, és a Kezelhető összetevők alapértelmezett paramétere.

States ScriptableObject példa az Inspectorban

A DefaultInteractableStates eszköz négy állapotot tartalmaz, és az állapotmodell implementációját használja.

  • Alapértelmezett:Semmi sem történik, ez a legszigeteltebb alapállapot.

  • Fókusz:Az objektumra mutat. Ez egyetlen állapot, jelenleg nincs más állapot beállítva, de az Alapértelmezett rangot fogja rangsorolva.

  • Nyomja le:Az objektumra mutat, és egy gomb vagy kéz lenyomása folyamatban van. A Press state out rangsorolja az Alapértelmezett és a Fókusz értéket. Ez az állapot a Fizikai lenyomás tartalékként is be lesz állítva.

  • Disabled: A gomb nem lehet interaktív, és a vizuális visszajelzés tudatja a felhasználóval, hogy ez a gomb valamilyen okból jelenleg nem használható. Elméletileg a letiltott állapot az összes többi állapotot is tartalmazhatja, de ha az Engedélyezve beállítás ki van kapcsolva, a Letiltva állapot az összes többi állapotot is tartalmazza.

A bitérték (#) a lista sorrendjétől függően van hozzárendelve az állapothoz.

Megjegyzés

Interakcióra használható összetevők létrehozásakor általában ajánlott a DefaultInteractableStates (Assets/MRTK/SDK/Features/UX/Interactable/States/DefaultInteractableStates.asset) használata.

Azonban 17 interakcióra használható állam érhető el, amelyek témákat vezérelnek, de némelyiket más összetevők vezérelik. Az alábbi lista a beépített funkciókkal rendelkezik.

  • Felkeresve: Az Interakciós elemre kattintott.
  • Váltógomb: A gomb váltóállapotban van, vagy a dimenzióindex páratlan szám.
  • Kézmozdulat: A kéz vagy a vezérlő le lett nyomva, és az eredeti pozíciójából helyezték át.
  • VoiceCommand: Egy beszédparancsot használtunk az Interakcióra használható parancs aktiválására.
  • Physical Touch: A rendszer jelenleg érintéses bemenetet észlel. Ezt a használatával NearInteractionTouchable engedélyezheti.
  • Grab: A kéz jelenleg megragadja az objektum határát, és a használatával NearInteractionGrabbable engedélyezi

Engedélyezve

Be- és bekapcsolja, hogy egy Interakciós eszköz engedélyezve legyen-e. Ez a kódban a Interactable.IsEnabled következőnek felel meg: .

A Interactable engedélyezett tulajdonsága eltér a GameObject/Component (például SetActive stb.) által konfigurált enabled tulajdonságtól. A GameObject vagy a Interactable MonoBehaviour letiltja az osztályban lévő összes futását, beleértve a bemeneteket, a vizuális témákat, az eseményeket stb. A segítségével történő letiltás letiltja a legtöbb bemeneti kezelést, és visszaállítja a kapcsolódó bemeneti államokat. A osztály azonban továbbra is minden képkockát futtat, és fogadja a bemeneti eseményeket, amelyeket a rendszer figyelmen kívül hagy. Ez akkor hasznos, ha letiltott állapotban jeleníti meg az Interakciós interakciót, amely a vizualizációs témákon keresztül érhető el. Erre jellemző példa egy küldés gomb, amely az összes szükséges beviteli mező befejezésére vár.

Bemeneti műveletek

Válassza ki a bemeneti műveletet abból a bemeneti konfigurációból vagy vezérlőleképezési profilból, amelyre az Interakcióra használható összetevőnek reagálnia kell.

Ez a tulajdonság futásidőben konfigurálható kódban a következőn Interactable.InputAction keresztül: .

IsGlobal

Ha true (igaz) érték van megjelölve, az összetevő globális bemeneti figyelőként lesz megjelölve a kiválasztott bemeneti művelethez. Az alapértelmezett viselkedés hamis, ami a bemenetet csak erre az interakcióra használható összeütköztetőre/GameObjectre korlátozza.

Ez a tulajdonság futásidőben konfigurálható kódban a következőn Interactable.IsGlobal keresztül: .

Beszédparancs

AzMRTK Speech Commands-profilból származó Speech parancs egy OnClick-esemény hangalapú interakcióhoz való aktiválására.

Ez a tulajdonság futásidőben konfigurálható kódban a következőn Interactable.VoiceCommand keresztül: .

Fókuszt igényel

Ha igaz, a hangparancs csak akkor és csak akkor aktiválja az Interakcióra használhatót, ha már egy mutatóból van fókuszban. Ha hamis, akkor az Interakciós elem a kiválasztott hangparancs globális figyelője lesz. Az alapértelmezett viselkedés igaz, mivel egy jelenetben nehéz lehet több globális beszéd figyeljét rendszerezni.

Ez a tulajdonság futásidőben konfigurálható kódban a következőn Interactable.VoiceRequiresFocus keresztül: .

Kijelölési mód

Ez a tulajdonság határozza meg a kiválasztási logikát. Amikor egy Interakciós elemre kattint, az egy következő dimenziószintre lép. A dimenziók hasonlóak a rangsoroláshoz, és a bemeneten kívüli állapotot (fókusz, lenyomás stb.) definiálják. Ezek akkor hasznosak, ha váltó vagy más, gombhoz társított több rangsorú államot definiál. Az aktuális dimenziószintet a követi Interactable.DimensionIndex nyomon.

Az elérhető kiválasztási módok a következőek:

  • GombDimensions = 1, simple clickable Interactable
  • VáltásDimensions = 2, Interakcióra használható alternatívák a ki vankapcsolva állapot között
  • TöbbdimenziósMéretek = 3, minden kattintás növeli az aktuális dimenzió szintjét + 1. Hasznos lehet egy gomb állapotának listához való definiálása stb.

A kezelhető továbbá lehetővé teszi, hogy dimenziónként több téma is definiálható legyen. Ha például a SelectionMode=Togglevan kiválasztva, az egyik téma akkor alkalmazható, ha az Interakciós elem ki van választva, a másik pedig az összetevő kiválasztásakor.

Az aktuális kijelölési mód futásidőben kérdezhető le a következőn Interactable.ButtonMode keresztül: . A mód futásidőben való frissítése a tulajdonságnak a kívánt Interactable.Dimensions funkciónak megfelelő beállításával érhető el. Emellett a váltó- és a többdimenziós módokhoz hasznos aktuális dimenzió a segítségével érhető el.

Kezelhető profilok

A profilok olyan elemek, amelyek kapcsolatot hoznak létre egy GameObject és egy vizuális téma között. A profil határozza meg, hogy a téma milyen tartalmakat módosít, amikor állapotváltás történik.

A témák az anyagokhoz hasonlóan működnek. Ezek parancsfájlként használható objektumok, amelyek az aktuális állapot alapján egy objektumhoz hozzárendelendő tulajdonságok listáját tartalmazzák. A témák újra használhatók, és több interakcióra használható felhasználói felületi objektumhoz is hozzárendelhetők.

Visszaállítás semmisítse meg

A vizuális témák a kiválasztott témamotor osztályától és típusától függően módosítják a célzott GameObject különböző tulajdonságait. Ha a Reset On Destroy értéke igaz, amikor az Interakcióra használható összetevőt megsemmisítik, az összetevő visszaállítja az összes módosított tulajdonságot az aktív témákból az eredeti értékükbe. Ellenkező esetben az Interakcióra használható összetevő az adott módon hagyja meg a módosított tulajdonságokat. Ebben az utóbbi esetben az értékek utolsó állapota megmarad, hacsak nem módosítja egy másik külső összetevő. Az alapértelmezett érték a false (hamis).

Profilok profilja

Események

Minden Interakcióra használható összetevő rendelkezik egy OnClick-eseményzel, amely akkor vált ki, ha az összetevő egyszerűen ki van választva. A Interactable azonban használható az OnClickenkívül más bemeneti események észlelésére is.

Kattintson az Esemény hozzáadása gombra egy új típusú esemény fogadódefiníció hozzáadásához. A hozzáadás után válassza ki a kívánt eseménytípust.

Példa eseményekre)

Különböző típusú esemény fogadók létezik, amelyek különböző típusú bemenetekre reagálnak. Az MRTK az alábbi fogadókat tartalmazza.

Egyéni fogadó úgy is létrehozható, ha létrehoz egy új osztályt, amely kibővíti a ReceiverBase osztályt.

Példa esemény fogadóra

Példa váltó esemény fogadóra

Interakcióra használható fogadók

Az InteractableReceiver összetevő lehetővé teszi az események definiálát a forrásKént használható InteractableReceiver kívül. A InteractableReceiver egy szűrt eseménytípust figyel, amelyet egy másik Kommunikálható esemény vált ki. Ha a Kezelhető tulajdonság nincs közvetlenül hozzárendelve, akkor a Keresési hatókör tulajdonság határozza meg, hogy a InteractableReceiver milyen irányban figyelje az olyan eseményeket, amelyek önmagában, egy szülőben vagy egy gyermek GameObjectben vannak.

InteractableReceiverList hasonló módon viselkedik, de az egyező események listáját tartalmazza.

Kezelhető reciver

Egyéni események létrehozása

A Vizualizációstémákhoz hasonló események kiterjeszthetőek bármilyen állapotminta észlelésére vagy funkciók elérhetővé tere.

Az egyéni események két fő módon létrehozhatóak:

  1. Terjessze ki a osztályt egy egyéni esemény létrehozásához, amely megjelenik az eseménytípusok ReceiverBase legördülő listájában. Alapértelmezés szerint egy Unity-esemény van megadva, de további Unity-események is hozzáadhatóak, vagy beállítható úgy, hogy elrejtse a Unity-eseményeket. Ez a funkció lehetővé teszi, hogy a tervező egy projekten mérnökkel dolgozzon, és létrehoz egy egyéni eseményt, amit a tervező a szerkesztőben tud beállítani.

  2. Terjessze ki a osztályt egy teljesen egyéni eseményösszetevő létrehozásához, amely a Kommunikálható objektumon vagy ReceiverBaseMonoBehavior egy másik objektumon található. ReceiverBaseMonoBehavior A ReceiverBaseMonoBehavior az Interakciós ReceiverBaseMonoBehavior az állapotváltozások észlelésére.

Példa bővítésre ReceiverBase

A osztály megjeleníti az Interakciós entitások állapotinformációját, és egy példa egy egyéni esemény fogadó CustomInteractablesReceiver létrehozására. CustomInteractablesReceiver

public CustomInteractablesReceiver(UnityEvent ev) : base(ev, "CustomEvent")
{
    HideUnityEvents = true; // hides Unity events in the receiver - meant to be code only
}

Az egyéni esemény fogadó létrehozásakor az alábbi metódusok felülbírálása/megvalósítása hasznos. ReceiverBase.OnUpdate() A egy absztrakt metódus, amely az állapotminták/átmenetek észlelésére használható. Emellett a és a metódus akkor is hasznos, ha egyéni eseménylogikát ReceiverBase.OnVoiceCommand()ReceiverBase.OnClick() hoz létre, ha az ReceiverBase.OnVoiceCommand() van kiválasztva.

public override void OnUpdate(InteractableStates state, Interactable source)
{
    if (state.CurrentState() != lastState)
    {
        // the state has changed, do something new
        lastState = state.CurrentState();
        ...
    }
}

public virtual void OnVoiceCommand(InteractableStates state, Interactable source,
                                    string command, int index = 0, int length = 1)
{
    base.OnVoiceCommand(state, source, command, index, length);
    // voice command called, perform some action
}  

public virtual void OnClick(InteractableStates state,
                            Interactable source,
                            IMixedRealityPointer pointer = null)
{
    base.OnClick(state, source);
    // click called, perform some action
}
Egyéni esemény fogadómezőinek megjelenítése a vizsgálóban

A ReceiverBase-szkriptek attribútumokkal fedik fel az egyéni tulajdonságokat a vizsgálóban. Példa a Vector3 egyéni tulajdonságra, elemleírással és címkével kapcsolatos információkkal. Ez a tulajdonság konfigurálhatóként fog mutatni az inspectorban, ha ki van választva egy Interakciós GameObject, és hozzá van adva a társított esemény fogadótípus.

[InspectorField(Label = "<Property label>",Tooltip = "<Insert tooltip info>",Type = InspectorField.FieldTypes.Vector3)]
public Vector3 EffectOffset = Vector3.zero;

A Kezelhetők használata

Egyszerű gomb kiépítése

Létrehozhat egy egyszerű gombot, ha hozzáadja az Interakcióra alkalmas összetevőt egy GameObjecthez, amely a bemeneti események fogadására van konfigurálva. A bemenet fogadása egy collider vagy egy gyermek számára is lehet. Ha a Interactablet Unity UI-alapú GameObjects használatával használja, annak a Canvas GameObject alatt kell lennie.

Még egy lépéssel tovább adhatja a gombot, ha létrehoz egy új profilt, hozzárendeli magát a GameObjectet, és létrehoz egy új témát. Emellett az OnClick esemény használatával is történhet valami.

Megjegyzés

A gomb megnyomhatóként való használatához az összetevőre van szükség. Emellett az összetevőre azért van szükség, hogy az Interakcióra alkalmas összetevőre lenyomási eseményeket PhysicalPressEventRouterPhysicalPressEventRouter

Váltógombok és többdimenziós gombok létrehozása

Váltógomb

A Váltógomb bekapcsolhatóként való gombra úgy módosíthatja a mezőt, hogy Selection Mode begépelje a következőt: Toggle . A Profilok szakaszban új, váltógombos téma lesz hozzáadva minden olyan profilhoz, amely akkor használatos, amikor az Interakciós kapcsoló be van váltva.

Amíg a váltógombra van állítva, az SelectionModeSelectionMode jelölőnégyzet segítségével beállíthatja a vezérlő alapértelmezett értékét a futásidő inicializálása során.

A CanSelect azt jelenti, hogy az Interakciós eszköz kikapcsoltról be, míg a CanDeselect az inverzet jelenti.

Példa a profiltémák váltógombra

A fejlesztők a és a felület használatával lekért vagy beállíthatnak egy Interakciós interakció SetToggledIsToggledSetToggled kóddal.

// If using SelectionMode = Toggle (i.e Dimensions == 2)

// Make the Interactable selected and toggled on
myInteractable.IsToggled = true;

// Get whether the Interactable is selected or not
bool isSelected = myInteractable.IsToggled;
Gombgyűjtemény váltása

Gyakran van egy lista váltógombokról, amelyekben egyszerre csak egy lehet aktív, más néven radiális halmaz vagy választógomb.

A funkció InteractableToggleCollection engedélyezéséhez használja az összetevőt. Ez a vezérlő biztosítja, hogy egy adott időpontban csak egy Interakciós lehetőség legyen bekapcsolva. A RadialSet (Assets/MRTK/SDK/Features/UX/Interactable/Prefabs/RadialSet.prefab) szintén remek kezdőpont.

Egyéni radiális gombcsoport létrehozása:

  1. Több interakcióra használható GameObjects/gomb létrehozása
  2. Állítsa be az egyes Interakcióka SelectionMode = Váltógomb, a CanSelect = true és a CanDeselect = false értékeket
  3. Hozzon létre egy üres gameObject szülőt az összes Interakciós elemhez, és adja hozzá a InteractableToggleCollection összetevőt
  4. Adja hozzá az összes interakcióra használható et a ToggleList listához a InteractableToggleCollection gombra
  5. Állítsa be a InteractableToggleCollection.CurrentIndex tulajdonságot annak meghatározásához, hogy melyik gomb legyen alapértelmezés szerint kijelölve az indításkor
Gyűjtemény váltása

Többdimenziós gomb

A többdimenziós kijelölési mód szekvenciális gombok vagy kétnál több lépésből álló gomb létrehozására használható, például a sebesség szabályozására három értékkel: Gyors (1x), Gyorsabb (2x) vagy Leggyorsabb (3x).

Ha a dimenziók numerikus értékek, akár 9 téma is hozzáadható a gomb szövegcímkéje vagy textúraszerkezetének szabályozásához minden egyes sebességbeállításhoz, különböző téma használatával.

Minden kattintási esemény futásidőben DimensionIndex 1-ével halad előre, amíg el Dimensions nem érik az értéket. Ezután a ciklus 0-ra áll vissza.

Példa többdimenziós profilra

A fejlesztők felmérhetik DimensionIndex a(z) et annak meghatározásához, hogy melyik dimenzió aktív jelenleg.

// If using SelectionMode = Multi-dimension (i.e Dimensions >= 3)

//Access the current DimensionIndex
int currentDimension = myInteractable.CurrentDimension;

//Set the current DimensionIndex to 2
myInteractable.CurrentDimension = 2;

// Promote Dimension to next level
myInteractable.IncreaseDimension();

Interakcióra használható létrehozása futásidőben

Az interakció bármely GameObjecthez egyszerűen hozzáadható futásidőben. Az alábbi példa bemutatja, hogyan rendelhet hozzá egy profiltémával.

var interactableObject = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
var interactable = interactableObject.AddComponent<Interactable>();

// Get the default configuration for the Theme engine InteractableColorTheme
var newThemeType = ThemeDefinition.GetDefaultThemeDefinition<InteractableColorTheme>().Value;

// Define a color for every state in our Default Interactable States
newThemeType.StateProperties[0].Values = new List<ThemePropertyValue>()
{
    new ThemePropertyValue() { Color = Color.black},  // Default
    new ThemePropertyValue() { Color = Color.black}, // Focus
    new ThemePropertyValue() { Color = Random.ColorHSV()},   // Pressed
    new ThemePropertyValue() { Color = Color.black},   // Disabled
};

interactable.Profiles = new List<InteractableProfileItem>()
{
    new InteractableProfileItem()
    {
        Themes = new List<Theme>()
        {
            Interactable.GetDefaultThemeAsset(new List<ThemeDefinition>() { newThemeType })
        },
        Target = interactableObject,
    },
};

// Force the Interactable to be clicked
interactable.TriggerOnClick()

Kezelhető események kóddal

Az alábbi példában egy műveletet adhat hozzá az alapeseményhez a Interactable.OnClick kódon keresztül.

public static void AddOnClick(Interactable interactable)
{
    interactable.OnClick.AddListener(() => Debug.Log("Interactable clicked"));
}

A függvény Interactable.AddReceiver<T>() használatával dinamikusan adhat hozzá esemény fogadókat futásidőben.

Az alábbi példakód bemutatja, hogyan adhat hozzá egy InteractableOnFocusReceiverkódot, amely a fókusz be- és kilépését figyeli, valamint meghatározza az eseménypéldányok eltolt végrehajtásához szükséges műveletkódot.

public static void AddFocusEvents(Interactable interactable)
{
    var onFocusReceiver = interactable.AddReceiver<InteractableOnFocusReceiver>();

    onFocusReceiver.OnFocusOn.AddListener(() => Debug.Log("Focus on"));
    onFocusReceiver.OnFocusOff.AddListener(() => Debug.Log("Focus off"));
}

Az alábbi példakód bemutatja, hogyan adhat hozzá egy InteractableOnToggleReceiverkódot, amely a kiválasztott/nem kijelölt állapotváltásokat a váltóval használható Interakciós elemekre figyel, továbbá meghatározza az eseménypéldányok oltásakor végrehajtani szükséges műveletkódot.

public static void AddToggleEvents(Interactable interactable)
{
    var toggleReceiver = interactable.AddReceiver<InteractableOnToggleReceiver>();

    // Make the interactable have toggle capability, from code.
    // In the gui editor it's much easier
    interactable.Dimensions = 2;
    interactable.CanSelect = true;
    interactable.CanDeselect  = true;

    toggleReceiver.OnSelect.AddListener(() => Debug.Log("Toggle selected"));
    toggleReceiver.OnDeselect.AddListener(() => Debug.Log("Toggle un-selected"));
}

Lásd még