Share via


Skapa en dataprovider för indatasystem – MRTK2

Indatasystemet Mixed Reality Toolkit är ett utökningsbart system för att aktivera stöd för indataenheter. Om du vill lägga till stöd för en ny maskinvaruplattform kan en anpassad indataprovider krävas.

Den här artikeln beskriver hur du skapar anpassade dataprovidrar, även kallade enhetshanterare, för indatasystemet. Exempelkoden som visas här är från WindowsMixedRealityDeviceManager.

Den fullständiga koden som används i det här exemplet finns i mappen MRTK/Providers/WindowsMixedReality.

Namnområde och mappstruktur

Dataleverantörer kan distribueras som ett tillägg från tredje part eller som en del av Microsoft Mixed Reality Toolkit. Godkännandeprocessen för inlämning av nya dataleverantörer till MRTK kommer att variera från fall till fall och kommer att meddelas vid tidpunkten för det ursprungliga förslaget.

Viktigt

Om en dataprovider för indatasystem skickas till Mixed Reality Toolkit-lagringsplatsenmåste namnområdet börja med Microsoft.MixedReality.Toolkit (t.ex. Microsoft.MixedReality.Toolkit.WindowsMixedReality) och koden ska finnas i en mapp under MRTK/Providers (t.ex. MRTK/Providers/WindowsMixedReality).

Namnområde

Dataprovidrar måste ha ett namnområde för att minimera potentiella namnkollisioner. Vi rekommenderar att namnområdet innehåller följande komponenter.

  • Företagsnamn
  • Funktionsområde

En indataprovider som skapats av Contoso-företaget kan till exempel vara "Contoso.MixedReality.Toolkit.Input".

Vi rekommenderar att källkoden för dataproviders placeras i en mapphierarki enligt följande bild.

Exempel på mappstruktur

Där ContosoInput innehåller implementeringen av dataprovidern innehåller mappen Editor kontrollanten (och annan specifik kod för Unity-redigeraren), mappen Textures innehåller bilder av kontrollanter som stöds och Profiler innehåller en eller flera färdiga profiler.

Anteckning

Några vanliga kontrollantbilder finns i mappen MixedRealityToolkit\StandardAssets\Textures.

Implementera dataprovidern

Ange arv av gränssnitt och/eller basklass

Alla dataprovidrar för indatasystem måste implementera IMixedRealityInputDeviceManager gränssnittet, vilket anger den minsta funktionalitet som krävs av indatasystemet. MRTK-grunden innehåller BaseInputDeviceManager klassen som tillhandahåller en standardimplementering av den här nödvändiga funktionen. För enheter som bygger på Unitys UInput-klass UnityJoystickManager kan klassen användas som basklass.

Anteckning

Klasserna BaseInputDeviceManager och UnityJoystickManager tillhandahåller den implementering som krävs IMixedRealityInputDeviceManager .

public class WindowsMixedRealityDeviceManager :
    BaseInputDeviceManager,
    IMixedRealityCapabilityCheck
{ }

IMixedRealityCapabilityCheck används av WindowsMixedRealityDeviceManager för att indikera att det ger stöd för en uppsättning indatafunktioner, särskilt artikulerade händer, blickgest-rösthänder och rörelsestyrenheter.

Använda attributet MixedRealityDataProvider

Ett viktigt steg för att skapa en dataprovider för indatasystem är att tillämpa MixedRealityDataProvider attributet på klassen . Med det här steget kan du ange standardprofilen och plattformarna för providern när de väljs i indatasystemprofilen.

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

Implementera metoderna IMixedRealityDataProvider

När klassen har definierats är nästa steg att tillhandahålla implementeringen av IMixedRealityDataProvider gränssnittet.

Anteckning

Klassen BaseInputDeviceManager , via BaseService klassen, tillhandahåller endast tomma implementeringar för IMixedRealityDataProvider metoder. Informationen om dessa metoder är vanligtvis dataleverantörsspecifika.

De metoder som ska implementeras av dataprovidern är:

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

Implementera dataproviderlogik

Nästa steg är att lägga till logiken för att hantera indataenheterna, inklusive eventuella kontrollanter som ska stödjas.

Implementera kontrollantklasserna

Exemplet på WindowsMixedRealityDeviceManager definierar och implementerar följande kontrollantklasser.

Källkoden för var och en av dessa klasser finns i mappen MRTK/Providers/WindowsMixedReality.

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

Anteckning

Alla enhetshanterare stöder inte flera typer av styrenheter.

Använda attributet MixedRealityController

Tillämpa sedan attributet MixedRealityController på klassen . Det här attributet anger typ av kontrollant (t.ex. artikulerad hand), överlämnande (t.ex. vänster eller höger) och en valfri kontrollantbild.

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

Konfigurera interaktionsmappningarna

Nästa steg är att definiera den uppsättning interaktionsmappningar som stöds av kontrollanten. För enheter som tar emot sina data via Unity-klassen Input är kontrollantmappningsverktyget en användbar resurs för att bekräfta rätt axel- och knappmappningar att tilldela till interaktioner.

Följande exempel förkortas från GenericOpenVRController klassen som finns i mappen MRTK/Providers/OpenVR.

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

Anteckning

Klassen ControllerMappingLibrary innehåller symboliska konstanter för Unity-indataaxeln och knappdefinitionerna.

Skapa meddelandehändelser

För att göra det möjligt för program att svara på indata från användaren, skapar dataprovidern meddelandehändelser som motsvarar ändringar av kontrollantens tillstånd enligt definitionen i gränssnitten IMixedRealityInputHandler och IMixedRealityInputHandler<T> .

För kontroller av digital typ (knapp) genererar du händelserna OnInputDown och OnInputUp.

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

För analoga kontroller (t.ex. pekplattans position) ska händelsen InputChanged aktiveras.

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

Lägg till Unity Profiler-instrumentation

Prestanda är avgörande i program för mixad verklighet. Varje komponent lägger till en viss mängd omkostnader som program måste ta hänsyn till. Därför är det viktigt att alla indataproviders innehåller Unity Profiler-instrumentation i den inre loopen och ofta använda kodsökvägar.

Vi rekommenderar att du implementerar det mönster som används av MRTK när du instrumenterar anpassade providrar.

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

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

Anteckning

Namnet som används för att identifiera profilerarmarkören är godtyckligt. MRTK använder följande mönster.

"[product] className.methodName – valfri anteckning"

Vi rekommenderar att anpassade dataprovidrar följer ett liknande mönster för att förenkla identifieringen av specifika komponenter och metoder vid analys av spårningar.

Skapa profilen och kontrollanten

I Mixed Reality Toolkit konfigureras dataprovidrar med hjälp av profiler.

Dataprovidrar med ytterligare konfigurationsalternativ (till exempel InputSimulationService) bör skapa en profil och kontroll så att kunderna kan ändra beteendet så att det passar programmets behov på bästa sätt.

Den fullständiga koden för exemplet i det här avsnittet finns i MRTK. Mappen Services/InputSimulation.

Definiera profilen

Profilinnehållet bör spegla de tillgängliga egenskaperna för övervakaren (till exempel uppdateringsintervall). Alla användarkonfigurerbara egenskaper som definierats i varje gränssnitt ska finnas i profilen.

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

Attributet CreateAssetMenu kan tillämpas på profilklassen så att kunder kan skapa en profilinstans med hjälp av menyn Skapa > tillgångar > Mixed Reality Toolkit-profiler>.

Implementera inspektören

Profilkontrollanter är användargränssnittet för att konfigurera och visa profilinnehåll. Varje profilkontroll bör utöka klassen "BaseMixedRealityToolkitConfigurationProfileInspector ".

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

Attributet CustomEditor informerar Unity om vilken typ av tillgång som kontrollanten gäller för.

Skapa sammansättningsdefinitioner

Mixed Reality Toolkit använder sammansättningsdefinitionsfiler (.asmdef) för att ange beroenden mellan komponenter samt för att hjälpa Unity att minska kompileringstiden.

Vi rekommenderar att sammansättningsdefinitionsfiler skapas för alla dataleverantörer och deras redigerarkomponenter.

Med hjälp av mappstrukturen i det tidigare exemplet skulle det finnas två .asmdef-filer för ContosoInput-dataprovidern.

Den första sammansättningsdefinitionen gäller för dataprovidern. I det här exemplet kallas det ContosoInput och finns i exemplets ContosoInput-mapp. Den här sammansättningsdefinitionen måste ange ett beroende för Microsoft.MixedReality.Toolkit och andra sammansättningar som den är beroende av.

Sammansättningsdefinitionen ContosoInputEditor anger profilkontrollen och eventuell redigeringsspecifik kod. Den här filen måste finnas i rotmappen i redigeringskoden. I det här exemplet finns filen i mappen ContosoInput\Editor. Den här sammansättningsdefinitionen innehåller en referens till ContosoInput-sammansättningen samt:

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

Registrera dataprovidern

När dataleverantören har skapats kan den registreras med indatasystemet och användas i programmet.

Registrerade dataprovidrar för indatasystem

Paketering och distribution

Dataleverantörer som distribueras som komponenter från tredje part har specifik information om paketering och distribution som utvecklare föredrar. Förmodligen är den vanligaste lösningen att generera ett .unitypackage och distribuera via Unity Asset Store.

Om en dataleverantör skickas in och godkänns som en del av Microsoft Mixed Reality Toolkit-paketet paketeras och distribueras Microsoft MRTK-teamet som en del av MRTK-erbjudandena.

Se även