Interativos
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.
MRTKBaseInteractable : XRBaseInteractable
- Essa classe oferece filtragem e sinalização para diferentes tipos de interagentes. Embora o XRI base
XRBaseInteractable
não discrimine os tipos de interagentes,MRTKBaseInteractable
fornece funções de conveniência para verificar se os tipos comuns de interações estão ocorrendo. As propriedades de conveniência comoIsGazeHovered
ouIsGrabSelected
são atalhos para consultar se um interagente participante implementa uma determinada interface (correspondente,IGazeInteractor
ouIGrabInteractor
). Esses sinalizadores possuem mais desempenho do que iteração pela lista deinteractorsHovering
ouinteractorsSelecting
. Além disso,MRTKBaseInteractable
pode filtrar/rejeitar determinados tipos de interagentes, caso o desenvolvedor deseje excluir determinadas modalidades de entrada.
- Essa classe oferece filtragem e sinalização para diferentes tipos de interagentes. Embora o XRI base
StatefulInteractable : MRTKBaseInteractable
- Embora
MRTKBaseInteractable
simplesmente adicione sinalizadores e filtros e evite adicionar qualquer estado adicional aos interativos,StatefulInteractable
introduz recursos úteis com estado, como alternância e seleção de variáveis.
- Embora
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 está fortemente associada aos elementos visuais; se um deles fosse reprojetar os elementos visuais ou usar um botão de tamanho/forma/deslocamento/etc. diferente, o script de interação precisaria mudar.
No MRTK3, os interativos são estado puro e interação. O interativo não renderiza alterações visuais ou efeitos com base em seu estado interno; é simplesmente uma coleção de lógica de estado e interação altamente portátil entre configurações de apresentação visual.
O mesmo script PressableButton
pode ser usado para compilar uma bola macia ou um plano do tipo "trackpad" de pressão ou um pressionável abstrato que emita eventos de rede com um aperto. O script PressableButton
nã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, nossos componentes de botão geralmente usam StateVisualizer
em seus efeitos avançados de comentários baseados em 3D + sombreador, mas também fornecemos um exemplo BasicPressableButtonVisuals
que mostra como um driver visual extremamente simples pode ser criado em código.
Seleção de variáveis
StatefulInteractable
s 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 StatefulInteractable
s de MRTK podem ser qualquer fração de ponto flutuante selecionada.
Esse conceito é muito útil ao trabalhar no 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. Em todos os lugares do XR você vê essas variáveis, interações analógicas e MRTK equipados para ajudar os desenvolvedores a criar interações agradáveis 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 a Seleção com base em sua localização física e como eles estão pressionando para baixo no interativo. Outras classes derivadas podem introduzir formas arbitrárias de seleção diferentes.
Para os interativos fornecidos pelo MRTK, Selectedness()
e isSelected
sempre serão "concorda", ou seja, você nunca observará um Selectedness()
maior do que SelectThreshold
sem um XRI isSelected
correspondente e um interagente que acompanha no interactorsSelecting
.
Importante
Suas subclasses de interativos personalizadas podem obviamente substituir Selectedness
por algum outro valor completamente desconectado do XRI isSelected
, no entanto, nossos interativos não fazem isso e nós desencorajamos 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 interativos personalizado que dá suporte a um novo método de determinação de Selectedness()
, basta substituir o método e combinar sua nova seleção com a quantidade de seleção existente. Se você estiver usando StateVisualizer
ou qualquer outra camada visual que ouça a seleção de variáveis, ele responderá adequadamente 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.
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.