Creación de un proveedor de datos del sistema de entrada: MRTK2
El sistema de entrada Mixed Reality Toolkit es un sistema extensible para habilitar la compatibilidad con dispositivos de entrada. Para agregar compatibilidad con una nueva plataforma de hardware, es posible que se requiera un proveedor de datos de entrada personalizado.
En este artículo se describe cómo crear proveedores de datos personalizados, también denominados administradores de dispositivos, para el sistema de entrada. El código de ejemplo que se muestra aquí es de WindowsMixedRealityDeviceManager
.
El código completo usado en este ejemplo se puede encontrar en la carpeta MRTK/Providers/WindowsMixedReality.
Espacio de nombres y estructura de carpetas
Los proveedores de datos se pueden distribuir como un complemento de terceros o como parte de Microsoft Mixed Reality Toolkit. El proceso de aprobación de los envíos de nuevos proveedores de datos a MRTK variará según el caso y se comunicará en el momento de la propuesta inicial.
Importante
Si se envía un proveedor de datos del sistema de entrada al repositorio de Mixed Reality Toolkit, el espacio de nombres debe comenzar con Microsoft.MixedReality.Toolkit (por ejemplo: Microsoft.MixedReality.Toolkit.WindowsMixedReality) y el código debe encontrarse en una carpeta debajo de MRTK/Providers (por ejemplo, MRTK/Providers/WindowsMixedReality).
Espacio de nombres
Los proveedores de datos deben tener un espacio de nombres para mitigar posibles colisiones de nombres. Se recomienda que el espacio de nombres incluya los siguientes componentes.
- Nombre de la compañía
- Área de función
Por ejemplo, un proveedor de datos de entrada creado por la empresa Contoso puede ser "Contoso.MixedReality.Toolkit.Input".
Estructura de carpetas recomendada
Se recomienda que el código fuente de los proveedores de datos se incluya en una jerarquía de carpetas, como se muestra en la imagen siguiente.
Donde ContosoInput contiene la implementación del proveedor de datos, la carpeta Editor contiene el inspector (y cualquier otro código específico del editor de Unity), la carpeta Textures contiene imágenes de los controladores admitidos y Profiles contiene uno o varios perfiles creados previamente.
Nota
Algunas imágenes de controlador comunes se pueden encontrar en la carpeta MixedRealityToolkit\StandardAssets\Textures.
Implementación del proveedor de datos
Especificación de la interfaz o la herencia de clases base
Todos los proveedores de datos del sistema de entrada deben implementar la IMixedRealityInputDeviceManager
interfaz , que especifica la funcionalidad mínima requerida por el sistema de entrada. La base MRTK incluye la BaseInputDeviceManager
clase que proporciona una implementación predeterminada de esta funcionalidad necesaria. En el caso de los dispositivos que se basan en la clase UInput de Unity, la UnityJoystickManager
clase se puede usar como clase base.
Nota
Las BaseInputDeviceManager
clases y UnityJoystickManager
proporcionan la implementación necesaria IMixedRealityInputDeviceManager
.
public class WindowsMixedRealityDeviceManager :
BaseInputDeviceManager,
IMixedRealityCapabilityCheck
{ }
IMixedRealityCapabilityCheck
es utilizado porWindowsMixedRealityDeviceManager
para indicar que proporciona compatibilidad con un conjunto de funcionalidades de entrada, específicamente; manos articuladas, manos con gestos de mirada y controladores de movimiento.
Aplicación del atributo MixedRealityDataProvider
Un paso clave para crear un proveedor de datos del sistema de entrada es aplicar el MixedRealityDataProvider
atributo a la clase . Este paso permite establecer el perfil y las plataformas predeterminados para el proveedor, cuando se seleccionan en el perfil del sistema de entrada.
[MixedRealityDataProvider(
typeof(IMixedRealityInputSystem),
SupportedPlatforms.WindowsUniversal,
"Windows Mixed Reality Device Manager")]
public class WindowsMixedRealityDeviceManager :
BaseInputDeviceManager,
IMixedRealityCapabilityCheck
{ }
Implementar los métodos IMixedRealityDataProvider
Una vez definida la clase, el siguiente paso es proporcionar la implementación de la IMixedRealityDataProvider
interfaz.
Nota
La BaseInputDeviceManager
clase, a través de la BaseService
clase , solo proporciona implementaciones vacías para IMixedRealityDataProvider
los métodos. Los detalles de estos métodos suelen ser específicos del proveedor de datos.
Los métodos que debe implementar el proveedor de datos son:
Destroy()
Disable()
Enable()
Initialize()
Reset()
Update()
Implementación de la lógica del proveedor de datos
El siguiente paso consiste en agregar la lógica para administrar los dispositivos de entrada, incluidos los controladores que se admitirán.
Implementación de las clases de controlador
El ejemplo de WindowsMixedRealityDeviceManager
define e implementa las siguientes clases de controlador.
El código fuente de cada una de estas clases se puede encontrar en la carpeta MRTK/Providers/WindowsMixedReality.
- WindowsMixedRealityArticulatedHand.cs
- WindowsMixedRealityController.cs
- WindowsMixedRealityGGVHand.cs
Nota
No todos los administradores de dispositivos admitirán varios tipos de controlador.
Aplicación del atributo MixedRealityController
A continuación, aplique el MixedRealityController
atributo a la clase . Este atributo especifica el tipo de controlador (por ejemplo: mano articulada), la entrega (por ejemplo, izquierda o derecha) y una imagen de controlador opcional.
[MixedRealityController(
SupportedControllerType.WindowsMixedReality,
new[] { Handedness.Left, Handedness.Right },
"StandardAssets/Textures/MotionController")]
{ }
Configuración de las asignaciones de interacción
El siguiente paso consiste en definir el conjunto de asignaciones de interacción admitidas por el controlador. En el caso de los dispositivos que reciben sus datos a través de la clase Input de Unity, la herramienta de asignación de controladores es un recurso útil para confirmar las asignaciones de ejes y botones correctas para asignar a interacciones.
En el GenericOpenVRController
ejemplo siguiente se abrevia la clase , que se encuentra en la carpeta 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),
};
Nota
La ControllerMappingLibrary
clase proporciona constantes simbólicas para las definiciones de botón y eje de entrada de Unity.
Generar eventos de notificación
Para permitir que las aplicaciones respondan a la entrada del usuario, el proveedor de datos genera eventos de notificación correspondientes a los cambios de estado del controlador según se define en las IMixedRealityInputHandler
interfaces y IMixedRealityInputHandler<T>
.
Para los controles de tipo digital (botón), genere los eventos OnInputDown y 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);
}
En el caso de los controles analógicos (por ejemplo: posición del panel táctil), se debe generar el evento InputChanged.
InputSystem?.RaisePositionInputChanged(InputSource, ControllerHandedness, interactionMapping.MixedRealityInputAction, interactionSourceState.touchpadPosition);
Adición de instrumentación de Unity Profiler
El rendimiento es fundamental en las aplicaciones de realidad mixta. Cada componente agrega cierta cantidad de sobrecarga para la que las aplicaciones deben tener en cuenta. Para ello, es importante que todos los proveedores de datos de entrada contengan instrumentación de Unity Profiler en bucle interno y rutas de acceso de código usadas con frecuencia.
Se recomienda implementar el patrón utilizado por MRTK al instrumentar proveedores personalizados.
private static readonly ProfilerMarker GetOrAddControllerPerfMarker = new ProfilerMarker("[MRTK] WindowsMixedRealityDeviceManager.GetOrAddController");
private async void GetOrAddController(InteractionSourceState interactionSourceState)
{
using (GetOrAddControllerPerfMarker.Auto())
{
// Code to be measured.
}
}
Nota
El nombre usado para identificar el marcador del generador de perfiles es arbitrario. MRTK usa el siguiente patrón.
"[product] className.methodName : nota opcional"
Se recomienda que los proveedores de datos personalizados sigan un patrón similar para ayudar a simplificar la identificación de componentes y métodos específicos al analizar seguimientos.
Crear el perfil y el inspector
En Mixed Reality Toolkit, los proveedores de datos se configuran mediante perfiles.
Los proveedores de datos con opciones de configuración adicionales (por ejemplo, InputSimulationService) deben crear un perfil y un inspector para permitir a los clientes modificar el comportamiento para adaptarse mejor a las necesidades de la aplicación.
El código completo del ejemplo de esta sección se puede encontrar en MRTK. Carpeta Services/InputSimulation.
Definición del perfil
El contenido del perfil debe reflejar las propiedades accesibles del observador (por ejemplo, intervalo de actualización). Todas las propiedades configurables por el usuario definidas en cada interfaz deben estar contenidas en el perfil.
[CreateAssetMenu(
menuName = "Mixed Reality Toolkit/Profiles/Mixed Reality Simulated Input Profile",
fileName = "MixedRealityInputSimulationProfile",
order = (int)CreateProfileMenuItemIndices.InputSimulation)]
public class MixedRealityInputSimulationProfile : BaseMixedRealityProfile
{ }
El CreateAssetMenu
atributo se puede aplicar a la clase de perfil para permitir a los clientes crear una instancia de perfil mediante el menú Crear > recursos > Mixed Reality Perfiles del kit de herramientas>.
Implementar el inspector
Los inspectores de perfil son la interfaz de usuario para configurar y ver el contenido del perfil. Cada inspector de perfil debe extender la clase 'BaseMixedRealityToolkitConfigurationProfileInspector .
[CustomEditor(typeof(MixedRealityInputSimulationProfile))]
public class MixedRealityInputSimulationProfileInspector : BaseMixedRealityToolkitConfigurationProfileInspector
{ }
El CustomEditor
atributo informa a Unity del tipo de recurso al que se aplica el inspector.
Crear definiciones de ensamblado
Mixed Reality Toolkit usa archivos de definición de ensamblado (.asmdef) para especificar dependencias entre componentes, así como para ayudar a Unity a reducir el tiempo de compilación.
Se recomienda crear archivos de definición de ensamblado para todos los proveedores de datos y sus componentes del editor.
Con la estructura de carpetas del ejemplo anterior, habría dos archivos .asmdef para el proveedor de datos ContosoInput.
La primera definición de ensamblado es para el proveedor de datos. En este ejemplo, se llamará ContosoInput y se ubicará en la carpeta ContosoInput del ejemplo. Esta definición de ensamblado debe especificar una dependencia de Microsoft.MixedReality.Toolkit y de cualquier otro ensamblado en el que dependa.
La definición del ensamblado ContosoInputEditor especificará el inspector de perfil y cualquier código específico del editor. Este archivo debe encontrarse en la carpeta raíz del código del editor. En este ejemplo, el archivo se ubicará en la carpeta ContosoInput\Editor. Esta definición de ensamblado contendrá una referencia al ensamblado ContosoInput, así como:
- Microsoft.MixedReality.Toolkit
- Microsoft.MixedReality.Toolkit.Editor.Inspectors
- Microsoft.MixedReality.Toolkit.Editor.Utilities
Registro del proveedor de datos
Una vez creado, el proveedor de datos se puede registrar con el sistema de entrada y usarse en la aplicación.
Empaquetado y distribución
Los proveedores de datos que se distribuyen como componentes de terceros tienen los detalles específicos del empaquetado y la distribución que quedan a la preferencia del desarrollador. Probablemente, la solución más común será generar un archivo .unitypackage y distribuirlo a través del Almacén de recursos de Unity.
Si se envía y acepta un proveedor de datos como parte del paquete microsoft Mixed Reality Toolkit, el equipo de Microsoft MRTK empaquetará y lo distribuirá como parte de las ofertas de MRTK.