Criação de um fornecedor de dados do sistema de entrada

O sistema de entrada Mixed Reality Toolkit é um sistema extensível para permitir o suporte do dispositivo de entrada. Para adicionar suporte para uma nova plataforma de hardware, pode ser necessário um fornecedor de dados de entrada personalizado.

Este artigo descreve como criar fornecedores de dados personalizados, também chamados gestores de dispositivos, para o sistema de entrada. O código de exemplo mostrado aqui é do WindowsMixedRealityDeviceManager .

O código completo utilizado neste exemplo pode ser encontrado na pasta MRTK/Fornecedores/WindowsMixedReality.

Espaço de nome e estrutura de pasta

Os fornecedores de dados podem ser distribuídos como um complemento de terceiros ou como parte do Microsoft Mixed Reality Toolkit. O processo de aprovação para a apresentação de novos fornecedores de dados ao MRTK variará caso a caso e será comunicado no momento da proposta inicial.

Importante

Se um fornecedor de dados do sistema de entrada estiver a ser submetido ao repositório de ferramentas de realidade mista,o espaço de nomes deve começar por Microsoft.MixedReality.Toolkit (ex: Microsoft.MixedReality.Toolkit.WindowsMixedReality) e o código deve estar localizado numa pasta abaixo do MRTK/Providers (ex: MRTK/Providers/WindowsMixedReality).

Espaço de Nomes

Os fornecedores de dados são obrigados a ter um espaço de nome para mitigar potenciais colisões de nomes. Recomenda-se que o espaço de nomes inclua os seguintes componentes.

  • Nome da empresa
  • Área de recursos

Por exemplo, um fornecedor de dados de entrada criado pela empresa Contoso pode ser "Contoso.MixedReality.Toolkit.Input".

Recomenda-se que o código-fonte dos fornecedores de dados seja escondido numa hierarquia de pasta, tal como mostrado na imagem seguinte.

Exemplo de estrutura de pasta

Quando o ContosoInput contém a implementação do fornecedor de dados, a pasta Editor contém o inspetor (e qualquer outro código específico do editor da Unidade), a pasta Texturas contém imagens dos controladores suportados e os Perfis contêm um ou mais perfis pré-fabricados.

Nota

Algumas imagens comuns do controlador podem ser encontradas na pasta MixedRealityToolkit\StandardAssets\Textures.

Implementar o fornecedor de dados

Especificar interface e/ou herança de classe base

Todos os fornecedores de dados do sistema de entrada devem implementar a IMixedRealityInputDeviceManager interface, que especifica a funcionalidade mínima exigida pelo sistema de entrada. A fundação MRTK inclui a BaseInputDeviceManager classe que fornece uma implementação padrão desta funcionalidade necessária. Para dispositivos que se baseiam na classe UInput da Unidade, a UnityJoystickManager classe pode ser usada como classe base.

Nota

As BaseInputDeviceManager classes e as classes proporcionam a UnityJoystickManagerIMixedRealityInputDeviceManager implementação necessária.

public class WindowsMixedRealityDeviceManager :
    BaseInputDeviceManager,
    IMixedRealityCapabilityCheck
{ }

IMixedRealityCapabilityCheck é usado pelo WindowsMixedRealityDeviceManager para indicar que fornece suporte para um conjunto de capacidades de entrada, especificamente; mãos articuladas, mãos de voz de gesto de olhar e controladores de movimento.

Aplicar o atributo MixedRealityDataProvider

Um passo fundamental para a criação de um fornecedor de dados do sistema de entrada é aplicar o MixedRealityDataProvider atributo à classe. Este passo permite definir o perfil predefinido e a plataforma(s) para o fornecedor, quando selecionado no perfil do sistema de entrada.

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

Implementar os métodos IMixedRealityDataProvider

Uma vez definida a classe, o próximo passo é fornecer a implementação da IMixedRealityDataProvider interface.

Nota

A BaseInputDeviceManager classe, através da BaseService classe, fornece apenas implementações vazias para IMixedRealityDataProvider métodos. Os detalhes destes métodos são geralmente específicos do fornecedor de dados.

Os métodos que devem ser implementados pelo fornecedor de dados são:

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

Implementar a lógica do fornecedor de dados

O próximo passo é adicionar a lógica para a gestão dos dispositivos de entrada, incluindo quaisquer controladores a suportar.

Implementar as classes de controladores

O exemplo das WindowsMixedRealityDeviceManager definições e implementa as seguintes classes de controladores.

O código-fonte de cada uma destas classes pode ser encontrado na pasta MRTK/Fornecedores/WindowsMixedReality.

  • WindowsMixedRealityArticutedHand.cs
  • WindowsMixedRealityController.cs
  • WindowsMixedRealityGGVHand.cs

Nota

Nem todos os gestores de dispositivos suportam vários tipos de controladores.

Aplicar o atributo MixedRealityController

Em seguida, aplique o MixedRealityController atributo à classe. Este atributo especifica o tipo de controlador (ex: mão articulada), a handness (ex: esquerda ou direita) e uma imagem de controlador opcional.

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

Configure os mapeamentos de interação

O próximo passo é definir o conjunto de mapeamentos de interação suportados pelo controlador. Para dispositivos que recebem os seus dados através da classe Entrada da Unidade, a ferramenta de mapeamento do controlador é um recurso útil para confirmar o eixo correto e os mapeamentos de botões para atribuir a interações.

O exemplo a seguir é abreviado da GenericOpenVRController classe, localizada na pasta 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

A ControllerMappingLibrary classe fornece constantes simbólicas para o eixo de entrada unidade e definições de botões.

Aumentar eventos de notificação

Para permitir que as aplicações respondam à entrada do utilizador, o fornecedor de dados levanta eventos de notificação correspondentes às alterações do estado do controlador, tal como definidas nas IMixedRealityInputHandler interfaces e IMixedRealityInputHandler<T> interfaces.

Para controlos digitais (botão), levante os eventos OnInputDown e 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);
}

Para controlos analógicos (ex: posição touchpad) o evento InputChanged deve ser levantado.

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

Adicionar instrumentação de perfis de unidade

O desempenho é fundamental em aplicações de realidade mista. Cada componente adiciona uma quantidade de despesas gerais para as quais as aplicações devem ter em conta. Para tal, é importante que todos os fornecedores de dados de entrada contenham a instrumentação do Perfil de Unidade em loop interno e sejam frequentemente utilizados caminhos de código.

Recomenda-se implementar o padrão utilizado pelo MRTK ao instrumentar fornecedores 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

O nome usado para identificar o marcador de perfis é arbitrário. O MRTK utiliza o seguinte padrão.

"[produto] className.methodName - nota opcional"

Recomenda-se que os fornecedores de dados personalizados sigam um padrão semelhante para ajudar a simplificar a identificação de componentes e métodos específicos ao analisar vestígios.

Crie o perfil e o inspetor

No Conjunto de Ferramentas de Realidade Mista, os fornecedores de dados são configurados utilizando perfis.

Os fornecedores de dados com opções de configuração adicionais (ex: InputSimulationService)devem criar um perfil e inspetor para permitir que os clientes modifiquem o comportamento de melhor forma às necessidades da aplicação.

O código completo para o exemplo nesta secção pode ser encontrado no MRTK. Serviços/Pasta de EntradaSimulação.

Definir o perfil

O conteúdo do perfil deve espelhar as propriedades acessíveis do observador (ex: intervalo de atualização). Todas as propriedades configuráveis do utilizador definidas em cada interface devem ser contidas com o perfil.

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

O CreateAssetMenu atributo pode ser aplicado na classe de perfil para permitir que os clientes criem uma instância de perfil utilizando o menu CreateAssetMenu

Implementar o inspetor

Os inspetores de perfil são a interface do utilizador para configurar e visualizar conteúdos de perfil. Cada inspetor de perfil deve alargar a classe 'BaseMixedRealityToolkitConfigurationProfileInspector.

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

O CustomEditor atributo informa a Unidade do tipo de ativo a que o inspetor se aplica.

Criar definição de montagem(s)

O Mixed Reality Toolkit utiliza ficheiros de montagem(.asmdef)para especificar dependências entre componentes, bem como para ajudar a Unidade na redução do tempo de compilação.

Recomenda-se que os ficheiros de definição de montagem sejam criados para todos os fornecedores de dados e seus componentes editoriais.

Utilizando a estrutura da pasta no exemplo anterior, existiriam dois ficheiros .asmdef para o fornecedor de dados ContosoInput.

A primeira definição de montagem destina-se ao fornecedor de dados. Para este exemplo, será chamado ContosoInput e ficará localizado na pasta ContosoInput do exemplo. Esta definição de montagem deve especificar uma dependência do Microsoft.MixedReality.Toolkit e de quaisquer outros conjuntos de que dependa.

A definição de montagem do ContosoInputEditor especificará o inspetor de perfil e qualquer código específico do editor. Este ficheiro deve estar na pasta raiz do código editor. Neste exemplo, o ficheiro estará localizado na pasta ContosoInput\Editor. Esta definição de montagem conterá uma referência à montagem ContosoInput, bem como:

  • Microsoft.MixedReality.Toolkit
  • Microsoft.MixedReality.Toolkit.Editor.Inspetores
  • Microsoft.MixedReality.Toolkit.Editor.Utilities

Registar o fornecedor de dados

Uma vez criado, o fornecedor de dados pode ser registado no sistema de entrada e ser utilizado na aplicação.

Fornecedores de dados de sistema de entrada registados

Embalagem e distribuição

Os fornecedores de dados que são distribuídos como componentes de terceiros têm os detalhes específicos da embalagem e distribuição deixadas à preferência do desenvolvedor. Provavelmente, a solução mais comum será gerar uma .unidadepackage e distribuir através da Unity Asset Store.

Se um fornecedor de dados for submetido e aceite como parte do pacote Microsoft Mixed Reality Toolkit, a equipa mrtk da Microsoft irá empacotá-lo e distribuí-lo como parte das ofertas mrtk.

Ver também