interativos – MRTK3

O MRTK baseia-se no XRBaseInteractable fornecido pelo Kit de Ferramentas de Interação XR do Unity. O comportamento interativo e a API existentes têm suporte no MRTK e todos os nossos interativos personalizados obedecem à API interativa do XRI existente.

Para desenvolvedores iniciantes no XRI, é altamente recomendável examinar primeiro a Documentação de arquitetura do XRI do Unity.

Para expandir os mecanismos interativos incluídos no XRI, o MRTK oferece duas classes base nas quais as interações avançadas podem ser criadas, uma estendendo a outra.

Interactables inheritance diagram

  • MRTKBaseInteractable : XRBaseInteractable
    • Essa classe oferece filtragem e sinalização para diferentes tipos de interagentes. Embora o XRBaseInteractable base do XRI não discrimine os tipos de interagentes, o MRTKBaseInteractable oferece funções convenientes para verificar se os tipos comuns de interações estão ocorrendo. As propriedades de conveniência como IsGazeHovered ou IsGrabSelected são atalhos para consultar se um interagente participante implementa uma determinada interface (correspondente, IGazeInteractor ou IGrabInteractor). Esses sinalizadores possuem mais desempenho do que iteração pela lista de interactorsHovering ou interactorsSelecting. Além disso, o MRTKBaseInteractable pode filtrar/rejeitar determinados tipos de interagentes, caso o desenvolvedor queira excluir determinadas modalidades de entrada.
  • StatefulInteractable : MRTKBaseInteractable
    • Embora o MRTKBaseInteractable simplesmente adicione sinalizadores e filtros e evite adicionar outros estados aos interativos, o StatefulInteractable apresenta recursos úteis com estado, como alternância e seleção de variáveis.

Separação estrita de estado e elementos visuais

No MRTK 2.x, os interativos eram frequentemente responsáveis por conduzir seus próprios efeitos visuais, seja a compactação de um botão 3D, um efeito de focalização ou até mesmo apenas alterar a cor com um clique. A limitação dessa abordagem é que a lógica de interação é altamente vinculada aos visuais. Se você precisar reformular os visuais ou usar um tamanho, uma forma, um posicionamento ou outro tipo diferente de botão, o próprio script de interação precisará ser alterado.

No MRTK3, os interativos têm o estado e a interação puros. Os interativos não renderizam alterações ou efeitos visuais com base no próprio estado interno. É puramente uma coleção de lógica de estado e de interação que é altamente portátil entre as configurações de apresentação visual.

Strict isolation of state and visuals

O mesmo script PressableButton pode ser usado para criar uma bola macia, um plano do tipo "trackpad" pressionável ou um pressionável abstrato que emita eventos de rede com um pressionamento. O script PressableButtonnão se importa com "onde" está; ele pode estar dentro de uma Tela ou em um corpo rígido.

Para conduzir elementos visuais, um "driver visual" separado é usado para sondar o estado do interativo e renderizar os comentários apropriados. StateVisualizer é o método de baixo código recomendado para gerar efeitos comuns de comentários visuais do estado interativo, mas os desenvolvedores ficam livres para gravar seus próprios drivers visuais personalizados. Por exemplo, os componentes de botão geralmente usam StateVisualizer nos efeitos avançados de feedback baseados em 3D com sombreador, mas também oferecemos o exemplo BasicPressableButtonVisuals que mostra como um condutor visual simples pode ser criado em código.

Seleção de variáveis

StatefulInteractables o recurso adicional mais útil sobre a funcionalidade de XRI base é o suporte para a variável Selectedness. Embora os interativos XRI de base sejam selecionados ou não, os StatefulInteractables de MRTK podem ser qualquer fração de ponto flutuante selecionada.

Esse conceito é útil ao trabalhar em XR, pois quase todas as formas de entrada não são mais estados binários. Os controladores de movimentos geralmente têm gatilhos analógicos (ou apertos analógicos!), as interações com as mãos podem fornecer uma variável de "pinçamento" e as interações volumétricas de aperto podem soltar um botão ou uma superfície de aperto em uma quantidade variável. Essas interações variáveis e analógicas estão em todos os lugares de XR e o MRTK é equipado para ajudar os desenvolvedores a criar interações agradáveis com base nessas entradas analógicas.

Uma ampla gama de diferentes interativos e tipos de interações podem contribuir juntos para a Seleção geral de um interativo. Notavelmente, todos os interagentes que implementam IVariableSelectInteractor contribuem com sua quantidade de seleção analógica, normalmente por meio de um max() de todos os interagentes participantes. Essa quantidade variável é combinada com as seleções binárias e não variáveis provenientes de interagentes no estilo padrão.

Para classes derivadas como PressableButton, a função Selectedness() é substituída para incluir um "ingrediente" adicional à computação de seleção. Os interagentes que implementam IPokeInteractor podem contribuir com Selectedness de acordo com a localização física e a maneira de pressionar o interativo. Outras classes derivadas podem introduzir formas arbitrárias de seleção diferentes.

Variable selectedness

Para os interativos fornecidos pelo MRTK, Selectedness() e isSelected sempre serão "concordar", ou seja, você nunca observará um Selectedness() maior do que SelectThreshold sem um isSelected do XRI correspondente e um interagente que o acompanhe no interactorsSelecting.

Importante

As subclasses de interativos personalizados podem obviamente substituir Selectedness por outro valor sem nenhuma relação com o isSelected do XRI, no entanto, nossos interativos não fazem isso e não recomendamos essa prática. Em geral, nunca escreva interações que não tenham um interagente correspondente. A seleção XRI, na grande maioria dos casos, será suficiente e todas as interações personalizadas que você compilar deverão ser gravadas como interagentes.

Ao criar um interativo personalizado que dê suporte a um novo método de determinação de Selectedness(), basta substituir o método e combinar a nova Selectedness com a quantidade de seleção existente. Se você estiver usando o StateVisualizer ou outra camada visual que reconheça a seleção de variáveis, ele responderá corretamente ao novo tipo de seleção.

Mapear eventos do UGUI para XRI

Em alguns casos, é desejável que os interativos respondam a eventos de UGUI, como mouse, gamepad ou entrada de tela sensível ao toque. O UGUIInputAdapter, que é uma UGUI Selectable, recebe eventos de UGUI e os encaminha para um CanvasProxyInteractor, se houver.

UGUI adapter flow

Quando CanvasProxyInteractor é notificado dos eventos de UGUI pelo UGUIInputAdapter, ele emite ações XRI equivalentes no interativo relevante. O mapeamento entre as ações de entrada do UGUI e XRI possui algumas perdas e é uma área de desenvolvimento ativo.

Com esse sistema, os interativos XRI existentes criados para plataformas imersivas, mãos, controladores de movimento e entrada 3D podem reagir igualmente bem a controles 2D acessíveis, como mouse e gamepad.