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".
Rekommenderad mappstruktur
Vi rekommenderar att källkoden för dataproviders placeras i en mapphierarki enligt följande bild.
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 avWindowsMixedRealityDeviceManager
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.
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.