Bemenetirendszer-adatszolgáltató létrehozása – MRTK2

A Mixed Reality Eszközkészlet bemeneti rendszere egy bővíthető rendszer a bemeneti eszközök támogatásának engedélyezéséhez. Egy új hardverplatform támogatásának hozzáadásához szükség lehet egy egyéni bemeneti adatszolgáltatóra.

Ez a cikk bemutatja, hogyan hozhat létre egyéni adatszolgáltatókat, más néven eszközkezelőket a bemeneti rendszerhez. Az itt látható példakód a következőből származik WindowsMixedRealityDeviceManager: .

Az ebben a példában használt teljes kód az MRTK/Providers/WindowsMixedReality mappában található.

Névtér és mappastruktúra

Az adatszolgáltatók harmadik féltől származó bővítményként vagy a Microsoft Mixed Reality Toolkit részeként terjeszthetők. Az új adatszolgáltatók MRTK-hoz való benyújtásának jóváhagyási folyamata eseti alapon változik, és az eredeti javaslat időpontjában lesz közölve.

Fontos

Ha egy bemenetirendszer-adatszolgáltatót küld a Mixed Reality Toolkit-adattárba, a névtérnek a Microsoft.MixedReality.Toolkit (pl. Microsoft.MixedReality.Toolkit.WindowsMixedReality) kifejezéssel kell kezdődnie, és a kódnak egy, az MRTK/Providers (például: MRTK/Providers/WindowsMixedReality) alatti mappában kell lennie.

Névtér

Az adatszolgáltatóknak névtérrel kell rendelkezniük a lehetséges névütközések mérsékléséhez. Javasoljuk, hogy a névtér tartalmazza a következő összetevőket.

  • Cég neve
  • Funkcióterület

A Contoso vállalat által létrehozott bemeneti adatszolgáltató lehet például "Contoso.MixedReality.Toolkit.Input".

Javasoljuk, hogy az adatszolgáltatók forráskódját egy mappahierarchiában helyezze el, az alábbi képen látható módon.

Példamappa szerkezete

Ahol a ContosoInput az adatszolgáltató implementációját tartalmazza, a Szerkesztő mappában található az inspector (és bármely más Unity-szerkesztőspecifikus kód), a Textures mappa a támogatott vezérlők képeit, a Profiles pedig egy vagy több előre elkészített profilt tartalmaz.

Megjegyzés

Néhány gyakori vezérlőlemezkép a MixedRealityToolkit\StandardAssets\Textures mappában található.

Az adatszolgáltató implementálása

Interfész és/vagy alaposztályöröklés megadása

Minden bemenetirendszer-adatszolgáltatónak implementálnia kell az IMixedRealityInputDeviceManager interfészt, amely meghatározza a bemeneti rendszer által igényelt minimális funkcionalitást. Az MRTK-alaprendszer tartalmazza azt a BaseInputDeviceManager osztályt, amely a szükséges funkciók alapértelmezett implementálását biztosítja. A Unity UInput osztályára épülő eszközök esetében az UnityJoystickManager osztály használható alaposztályként.

Megjegyzés

A BaseInputDeviceManager és UnityJoystickManager az osztály biztosítja a szükséges IMixedRealityInputDeviceManager megvalósítást.

public class WindowsMixedRealityDeviceManager :
    BaseInputDeviceManager,
    IMixedRealityCapabilityCheck
{ }

IMixedRealityCapabilityCheck a segítségével WindowsMixedRealityDeviceManager jelezheti, hogy támogatja a beviteli képességek egy csoportját, különösen a csuklós kezeket, a tekintet-kézmozdulat-hang kezeket és a mozgásvezérlőket.

A MixedRealityDataProvider attribútum alkalmazása

A bemenetirendszer-adatszolgáltató létrehozásának egyik fő lépése az MixedRealityDataProvider attribútum alkalmazása az osztályra. Ez a lépés lehetővé teszi a szolgáltató alapértelmezett profiljának és platformjának beállítását, ha a bemenetirendszer-profilban van kiválasztva.

[MixedRealityDataProvider(
    typeof(IMixedRealityInputSystem),
    SupportedPlatforms.WindowsUniversal,
    "Windows Mixed Reality Device Manager")]
public class WindowsMixedRealityDeviceManager :
    BaseInputDeviceManager,
    IMixedRealityCapabilityCheck
{ }

Az IMixedRealityDataProvider metódusok implementálása

A osztály definiálása után a következő lépés az interfész implementálásának IMixedRealityDataProvider biztosítása.

Megjegyzés

A BaseInputDeviceManager osztály a BaseService osztályon keresztül csak üres implementációkat biztosít a IMixedRealityDataProvider metódusokhoz. Ezeknek a módszereknek a részletei általában adatszolgáltató-specifikusak.

Az adatszolgáltató által implementálandó módszerek a következők:

  • Destroy()
  • Disable()
  • Enable()
  • Initialize()
  • Reset()
  • Update()

Az adatszolgáltatói logika megvalósítása

A következő lépés a bemeneti eszközök kezelésére szolgáló logika hozzáadása, beleértve a támogatni kívánt vezérlőket is.

A vezérlőosztályok implementálása

A példa a WindowsMixedRealityDeviceManager következő vezérlőosztályokat definiálja és valósítja meg.

Az egyes osztályok forráskódja az MRTK/Providers/WindowsMixedReality mappában található.

  • WindowsMixedRealityArticulatedHand.cs
  • WindowsMixedRealityController.cs
  • WindowsMixedRealityGGVHand.cs

Megjegyzés

Nem minden eszközkezelő támogat több vezérlőtípust.

A MixedRealityController attribútum alkalmazása

Ezután alkalmazza az MixedRealityController attribútumot a osztályra. Ez az attribútum határozza meg a vezérlő típusát (pl. csuklós kéz), a kezességet (pl. balra vagy jobbra) és egy opcionális vezérlőrendszerképet.

[MixedRealityController(
    SupportedControllerType.WindowsMixedReality,
    new[] { Handedness.Left, Handedness.Right },
    "StandardAssets/Textures/MotionController")]
{ }

Az interakció-leképezések konfigurálása

A következő lépés a vezérlő által támogatott interakció-leképezések halmazának meghatározása. Azon eszközök esetében, amelyek a Unity Input osztályán keresztül kapják meg az adataikat, a vezérlőleképezési eszköz hasznos erőforrás a megfelelő tengely- és gombleképezések megerősítéséhez az interakciókhoz való hozzárendeléshez.

Az alábbi példa az MRTK/Providers/OpenVR mappában található osztály rövidítése GenericOpenVRController .

public override MixedRealityInteractionMapping[] DefaultLeftHandedInteractions => new[]
{
    // Controller Pose
    new MixedRealityInteractionMapping(0, "Spatial Pointer", AxisType.SixDof, DeviceInputType.SpatialPointer, MixedRealityInputAction.None),
    // Left Trigger Squeeze
    new MixedRealityInteractionMapping(1, "Trigger Position", AxisType.SingleAxis, DeviceInputType.Trigger, ControllerMappingLibrary.AXIS_9),
    // Left Trigger Press (Select)
    new MixedRealityInteractionMapping(2, "Trigger Press (Select)", AxisType.Digital, DeviceInputType.TriggerPress, KeyCode.JoystickButton14),
};

Megjegyzés

A ControllerMappingLibrary osztály szimbolikus állandókat biztosít a Unity bemeneti tengelyéhez és a gombdefiníciókhoz.

Értesítési események létrehozása

Annak érdekében, hogy az alkalmazások válaszolhassanak a felhasználótól érkező adatokra, az adatszolgáltató a vezérlő állapotváltozásainak megfelelő értesítési eseményeket hoz létre a és IMixedRealityInputHandler<T> interfészekben IMixedRealityInputHandler meghatározottak szerint.

A digitális (gombos) típusvezérlők esetében adja meg az OnInputDown és az OnInputUp eseményeket.

// inputAction is the input event that is to be raised.
if (interactionSourceState.touchpadPressed)
{
    InputSystem?.RaiseOnInputDown(InputSource, ControllerHandedness, inputAction);
}
else
{
    InputSystem?.RaiseOnInputUp(InputSource, ControllerHandedness, inputAction);
}

Analóg vezérlők (pl. érintőpárnák) esetén az InputChanged eseményt kell emelni.

InputSystem?.RaisePositionInputChanged(InputSource, ControllerHandedness, interactionMapping.MixedRealityInputAction, interactionSourceState.touchpadPosition);

Unity Profiler-kialakítás hozzáadása

A teljesítmény kritikus fontosságú a vegyes valóságú alkalmazásokban. Minden összetevő olyan többletterhelést ad hozzá, amelyet az alkalmazásoknak figyelembe kell vennie. Ezért fontos, hogy minden bemeneti adatszolgáltató tartalmazza a Unity Profiler rendszerállapotát a belső hurokban, valamint a gyakran használt kódútvonalakat.

Egyéni szolgáltatók kialakításakor ajánlott implementálni az MRTK által használt mintát.

        private static readonly ProfilerMarker GetOrAddControllerPerfMarker = new ProfilerMarker("[MRTK] WindowsMixedRealityDeviceManager.GetOrAddController");

        private async void GetOrAddController(InteractionSourceState interactionSourceState)
        {
            using (GetOrAddControllerPerfMarker.Auto())
            {
                // Code to be measured.
            }
        }

Megjegyzés

A profilkészítő jelölő azonosításához használt név tetszőleges. Az MRTK a következő mintát használja.

"[product] className.methodName – nem kötelező megjegyzés"

Javasoljuk, hogy az egyéni adatszolgáltatók hasonló mintát kövessenek, hogy megkönnyítsék bizonyos összetevők és módszerek azonosítását a nyomkövetések elemzésekor.

A profil és az ellenőr létrehozása

Az Mixed Reality Toolkitben az adatszolgáltatók profilok használatával vannak konfigurálva.

A további konfigurációs lehetőségekkel (például : InputSimulationService) rendelkező adatszolgáltatóknak létre kell hozniuk egy profilt és egy felügyelőt, amely lehetővé teszi az ügyfelek számára, hogy az alkalmazás igényeinek leginkább megfelelő módon módosítsák a viselkedést.

Az ebben a szakaszban szereplő példa teljes kódja az MRTK-ban található. Services/InputSimulation mappa.

Profil definiálása

A profil tartalmának tükröznie kell a megfigyelő elérhető tulajdonságait (pl. frissítési időköz). Az egyes felületeken definiált összes felhasználó által konfigurálható tulajdonságnak tartalmaznia kell a profilt.

[CreateAssetMenu(
    menuName = "Mixed Reality Toolkit/Profiles/Mixed Reality Simulated Input Profile",
    fileName = "MixedRealityInputSimulationProfile",
    order = (int)CreateProfileMenuItemIndices.InputSimulation)]
public class MixedRealityInputSimulationProfile : BaseMixedRealityProfile
{ }

Az CreateAssetMenu attribútum alkalmazható a profilosztályra, hogy az ügyfelek profilpéldányt hozzanak létre az Eszközök > létrehozása > Mixed Reality Eszközkészletprofilok > menü használatával.

Az ellenőr implementálása

A profilfelügyelők a profil tartalmának konfigurálására és megtekintésére szolgáló felhasználói felület. Minden profilfelügyelőnek ki kell terjesztenie a "BaseMixedRealityToolkitConfigurationProfileInspector osztályt.

[CustomEditor(typeof(MixedRealityInputSimulationProfile))]
public class MixedRealityInputSimulationProfileInspector : BaseMixedRealityToolkitConfigurationProfileInspector
{ }

Az CustomEditor attribútum tájékoztatja a Unityt arról, hogy milyen típusú objektumra vonatkozik az ellenőr.

Szerelvénydefiníció(k) létrehozása

Mixed Reality Eszközkészlet szerelvénydefiníciós (.asmdef) fájlokat használ az összetevők közötti függőségek meghatározásához, valamint a Unity segít a fordítási idő csökkentésében.

Javasoljuk, hogy a szerelvénydefiníciós fájlokat az összes adatszolgáltatóhoz és azok szerkesztőösszetevőihez hozza létre.

A korábbi példában a mappastruktúrát használva két .asmdef fájl lenne a ContosoInput adatszolgáltatóhoz.

Az első szerelvénydefiníció az adatszolgáltatóhoz tartozik. Ebben a példában ContosoInput néven jelenik meg, és a példa ContosoInput mappájában található. Ennek a szerelvénydefiníciónak meg kell adnia a Microsoft.MixedReality.Toolkit és minden más olyan szerelvény függőségét, amelytől függ.

A ContosoInputEditor szerelvénydefiníciója határozza meg a profilfelügyelőt és a szerkesztőspecifikus kódot. A fájlnak a szerkesztőkód gyökérmappájában kell lennie. Ebben a példában a fájl a ContosoInput\Editor mappában található. Ez a szerelvénydefiníció a ContosoInput szerelvényre mutató hivatkozást, valamint a következőket tartalmazza:

  • Microsoft.MixedReality.Toolkit
  • Microsoft.MixedReality.Toolkit.Editor.Inspectors
  • Microsoft.MixedReality.Toolkit.Editor.Utilities

Az adatszolgáltató regisztrálása

A létrehozás után az adatszolgáltató regisztrálható a bemeneti rendszeren, és használható az alkalmazásban.

Regisztrált bemenetirendszer-adatszolgáltatók

Csomagolás és elosztás

A harmadik féltől származó összetevőkként elosztott adatszolgáltatók a csomagolás és a terjesztés részleteit a fejlesztő előnyben részesítése szerint tekintik meg. Valószínű, hogy a leggyakoribb megoldás egy .unitypackage létrehozása és terjesztése a Unity Asset Store-on keresztül.

Ha egy adatszolgáltatót a Microsoft Mixed Reality Toolkit csomag részeként küld el és fogad el, a Microsoft MRTK csapata az MRTK-ajánlatok részeként csomagolja és terjeszti azt.

Lásd még