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.
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 comoIsGazeHovered
ouIsGrabSelected
são atalhos para consultar se um interator participante implementa uma determinada interface (correspondentemente,IGazeInteractor
ouIGrabInteractor
). Estes sinalizadores são mais eficazes do que iterar através da lista deinteractorsHovering
ouinteractorsSelecting
. Além disso,MRTKBaseInteractable
pode filtrar/rejeitar determinados tipos de interatores no caso de o programador pretender excluir determinadas modalidades de entrada.
- Esta classe oferece filtragem e sinalização para diferentes tipos de interatores. Embora o XRI
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.
- Ao
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.
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
StatefulInteractable
A 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 StatefulInteractable
podem 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.
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.
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.