Partilhar via


Interacionáveis — MRTK3

O MRTK baseia-se no XRBaseInteractable fornecido pelo XR Interaction Toolkit do Unity. O comportamento interacionável e a API existentes são totalmente suportados no MRTK e todos os nossos interacionáveis personalizados obedecem à API interacionável XRI existente.

Para programadores novos no XRI, recomendamos vivamente que reveja primeiro a documentação de arquitetura XRI do Unity.

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

Diagrama de herança interagiável

  • MRTKBaseInteractable : XRBaseInteractable
    • Esta classe oferece filtragem e sinalização para diferentes tipos de interatores. Embora o XRI XRBaseInteractable base não discrimina entre tipos de interação, MRTKBaseInteractable fornece funções de conveniência para verificar se estão a ocorrer tipos comuns de interações. Propriedades de conveniência como IsGazeHovered ou IsGrabSelected são atalhos para consultar se um interator participante implementa uma determinada interface (correspondentemente, IGazeInteractor ou IGrabInteractor). Estes sinalizadores são mais eficazes do que iterar através da lista de interactorsHovering ou interactorsSelecting. Além disso, MRTKBaseInteractable pode filtrar/rejeitar determinados tipos de interatores no caso de o programador pretender excluir determinadas modalidades de entrada.
  • StatefulInteractable : MRTKBaseInteractable
    • Ao MRTKBaseInteractable adicionar sinalizadores e filtros e evitar adicionar qualquer estado adicional ao interacionável, StatefulInteractable apresenta funcionalidades úteis com estado, como alternar e seleção de variáveis.

Separação estrita de estado e elementos visuais

No MRTK 2.x, os interagiveis eram muitas vezes responsáveis por conduzir os seus próprios efeitos visuais, seja a compressão de um botão 3D, um efeito de pairar ou até mesmo apenas alterar a cor num clique. A limitação desta abordagem é que a lógica de interação está fortemente vinculada aos elementos visuais. Se quiser redesenhar os elementos visuais ou utilizar um tamanho/forma/deslocamento/etc. diferente. do botão , o próprio script de interação teria de ser alterado.

No MRTK3, os interagiveis são um estado e interação puros. O interacionável não compõe quaisquer alterações ou efeitos visuais com base no seu estado interno. É puramente uma coleção de lógica de estado e interação que é altamente portátil entre configurações de apresentação visual.

Isolamento rigoroso do estado e dos elementos visuais

O mesmo PressableButton script pode ser utilizado para criar uma bola squishy, um plano "trackpad" premido ou um pressável abstrato que emite eventos de rede ao premir. O PressableButton script nem se importa com "onde" está; pode estar dentro de uma Tela ou num corpo rígido.

Para impulsionar elementos visuais, é utilizado um "controlador visual" separado para consultar o estado do interacionável e compor os comentários adequados. StateVisualizer é o método de baixo código recomendado para impulsionar efeitos de feedback visual comuns do estado interacionável, mas os programadores são livres de escrever os seus próprios controladores visuais personalizados. Por exemplo, os nossos componentes de botão geralmente utilizam StateVisualizer para os seus efeitos de feedback avançados baseados em 3D + sombreador, mas também fornecemos um exemplo BasicPressableButtonVisuals que mostra como um simples controlador visual pode ser criado em código.

Seleção de variáveis

StatefulInteractableA funcionalidade adicional mais útil sobre a funcionalidade XRI base é o suporte para a variável Selectedness. Embora os dispositivos interagiveis de base XRI estejam selecionados ou não selecionados, os do MRTK StatefulInteractablepodem ser qualquer fração de vírgula flutuante selecionada.

Este conceito é útil ao trabalhar em XR, uma vez que quase todas as formas de entrada já não são estados binários. Os controladores de movimento têm frequentemente acionadores analógicos (ou aderências analógicas!), as interações entre mãos podem fornecer uma variável "pinchedness" e as interações de premir volume podem deprimir um botão ou uma superfície pushable por uma quantidade variada. Verá estas interações analógicas e variáveis em todo o lado no XR e o MRTK está equipado para ajudar os programadores a criar interações deliciosas sobre estas entradas analógicas.

Uma vasta gama de diferentes interações e tipos de interações pode contribuir em conjunto para a Seleção geral de um interagiável. Nomeadamente, todos os interatores que implementam IVariableSelectInteractor contribuem com a respetiva quantidade de seleção analógica, normalmente através de um max() de todos os interatores participantes. Esta quantidade variável é combinada com as seleções binárias não variáveis provenientes de interações de estilo baunilha.

Para classes derivadas como PressableButton, a Selectedness() função é substituída para adicionar um "ingrediente" adicional à computação selecionada. Os interatores que implementam IPokeInteractor podem contribuir com a Seleção com base na sua localização física e na forma como estão a pressionar fisicamente o interagiável. Outras classes derivadas podem introduzir outras formas arbitrárias de seleção.

Seleção de variáveis

Para os dados interagiveis fornecidos pelo MRTK e Selectedness()isSelected irá sempre "concordar" por outras palavras, nunca observará um Selectedness() maior do que o SelectThreshold sem um XRI isSelected correspondente e um interator que o acompanha no interactorsSelecting.

Importante

As suas subclasses interacionáveis personalizadas podem obviamente substituir Selectedness outro valor completamente desligado do XRI isSelected; no entanto, os nossos interagiveis não o fazem e não o desencorajamos vivamente. Em geral, nunca escreva interações que não tenham um interação correspondente. A seleção de XRI será, na grande maioria dos casos, suficiente e quaisquer interações personalizadas que criar devem ser escritas como interações.

Quando estiver a criar um interacionável personalizado que suporte um novo método de determinação Selectedness(), basta substituir o método e combinar a sua nova seleção com a quantidade de seleção existente. Se estiver a utilizar StateVisualizer ou qualquer outra camada visual que ouça a seleção de variáveis, esta irá responder em conformidade com o seu novo tipo de seleção.

Mapear eventos UGUI para XRI

Em alguns casos, é desejável que os interagiveis respondam a eventos UGUI, como o rato, o gamepad ou a entrada do ecrã tátil. O UGUIInputAdapter, que é um UGUI Selectable, recebe eventos UGUI e reencaminha-os para um CanvasProxyInteractor, se existir um.

Fluxo do adaptador UGUI

Quando o CanvasProxyInteractor é notificado dos eventos UGUI pelo UGUIInputAdapter, emite ações XRI equivalentes no interacionável relevante. O mapeamento entre a entrada UGUI e as ações XRI é um pouco perdido e é uma área de desenvolvimento ativo.

Com este sistema, os XRI interagiveis existentes criados para plataformas envolventes, mãos, controladores de movimento e entrada 3D podem reagir igualmente bem a controlos 2D acessíveis, como o rato e o gamepad.