Controladores de movimento no Unity
Há duas maneiras principais de agir em seu olhar no Unity, gestos com as mãos e controladores de movimento no HoloLens e no HMD imersivo. Você acessa os dados de ambas as fontes de entrada espacial por meio das mesmas APIs no Unity.
O Unity fornece duas maneiras principais de acessar dados de entrada espacial para Windows Mixed Reality. As APIs comuns Input.GetButton/Input.GetAxis funcionam em vários SDKs do Unity XR, enquanto a API InteractionManager/GestureRecognizer específica do Windows Mixed Reality expõe o conjunto completo de dados de entrada espacial.
APIs de entrada XR do Unity
Para novos projetos, recomendamos usar as novas APIs de entrada XR desde o início.
Você pode encontrar mais informações sobre as APIs XR aqui.
Tabela de mapeamento de botão/eixo do Unity
O Gerenciador de Entrada do Unity para controladores de movimento Windows Mixed Reality dá suporte às IDs de botão e eixo listadas abaixo por meio das APIs Input.GetButton/GetAxis . A coluna "Específico do Windows MR" refere-se às propriedades disponíveis fora do tipo InteractionSourceState . Cada uma dessas APIs é descrita em detalhes nas seções abaixo.
Os mapeamentos de ID de botão/eixo para Windows Mixed Reality geralmente correspondem às IDs de botão/eixo do Oculus.
Os mapeamentos de ID de botão/eixo para Windows Mixed Reality diferem dos mapeamentos do OpenVR de duas maneiras:
- O mapeamento usa IDs de touchpad que são distintas do thumbstick, para dar suporte a controladores com thumbsticks e touchpads.
- O mapeamento evita sobrecarregar as IDs dos botões A e X para os botões Menu para deixá-los disponíveis para os botões ABXY físicos.
Entrada | APIs comuns do Unity (Input.GetButton/GetAxis) | API de entrada específica do Windows MR (XR. WSA. Entrada) |
|
---|---|---|---|
Mão esquerda | Mão direita | ||
Selecione o gatilho pressionado | Eixo 9 = 1,0 | Eixo 10 = 1,0 | selecionarPressionado |
Selecione o valor analógico do gatilho | Eixo 9 | Eixo 10 | selectPressedAmount |
Selecione o gatilho parcialmente pressionado | Botão 14 (compatibilidade com gamepad) | Botão 15 (compatível com gamepad) | selectPressedAmount > 0.0 |
Botão de menu pressionado | Botão 6* | Botão 7* | menuPressionado |
Botão de aperto pressionado | Eixo 11 = 1,0 (sem valores analógicos) Botão 4 (compatível com gamepad) | Eixo 12 = 1,0 (sem valores analógicos) Botão 5 (compatível com gamepad) | Agarrou |
Thumbstick X (esquerda: -1,0, direita: 1,0) | Eixo 1 | Eixo 4 | thumbstickPosition.x |
Thumbstick Y (superior: -1,0, inferior: 1,0) | Eixo 2 | Eixo 5 | thumbstickPosition.y |
Thumbstick pressionado | Botão 8 | Botão 9 | thumbstickPressed |
Touchpad X (esquerda: -1,0, direita: 1,0) | Eixo 17* | Eixo 19* | touchpadPosition.x |
Touchpad Y (superior: -1,0, inferior: 1,0) | Eixo 18* | Eixo 20* | touchpadPosition.y |
Touchpad tocado | Botão 18* | Botão 19* | touchpadTocado |
Touchpad pressionado | Botão 16* | Botão 17* | touchpadPressed |
6Pose de alça DoF ou pose de ponteiro | Pose de pegada apenas: XR. InputTracking.GetLocalPosition XR. InputTracking.GetLocalRotation | Passe Grip ou Pointer como um argumento: sourceState.sourcePose.TryGetPosition sourceState.sourcePose.TryGetRotation |
|
Estado de rastreamento | Precisão da posição e risco de perda de fonte disponíveis apenas por meio de API específica de RM | sourceState.sourcePose.positionAccuracy sourceState.properties.sourceLossRisk |
Observação
Esses IDs de botão/eixo diferem dos IDs que o Unity usa para OpenVR devido a colisões nos mapeamentos usados por gamepads, Oculus Touch e OpenVR.
OpenXR
Para saber mais sobre interações de realidade misturada no Unity, visite o Manual do Unity para Entrada XR do Unity. Esta documentação do Unity aborda os mapeamentos de entradas específicas do controlador para InputFeatureUsages mais generalizáveis, como as entradas XR disponíveis podem ser identificadas e categorizadas, como ler dados dessas entradas e muito mais.
O Plug-in OpenXR de Realidade Misturada fornece perfis de interação de entrada adicionais, mapeados para InputFeatureUsagepadrão s, conforme detalhado abaixo:
Uso de InputFeatureUsage | Controlador HP Reverb G2 (OpenXR) | Mão do HoloLens (OpenXR) |
---|---|---|
primário2DAxis | Manche | |
primário2DAxisClique | Joystick - Clique | |
gatilho | Gatilho | |
aperto | Aperto | Torneira ou aperto de ar |
botão primário | [X/A] - Pressione | Fechar e abrir dedos indicador e polegar |
botão secundário | [S/B] - Imprensa | |
aperto | Punho - Imprensa | |
triggerButton | Gatilho - Pressione | |
menuButton | Menu |
Pose de pegada vs. pose de apontar
Windows Mixed Reality dá suporte a controladores de movimento em uma variedade de fatores forma. O design de cada controlador difere em sua relação entre a posição da mão do usuário e a direção natural "para frente" que os aplicativos devem usar para apontar ao renderizar o controlador.
Para representar melhor esses controladores, há dois tipos de poses que você pode investigar para cada fonte de interação, a pose de alça e a pose de ponteiro. As coordenadas de pose de alça e pose de ponteiro são expressas por todas as APIs do Unity em coordenadas mundiais globais do Unity.
Pose de aderência
A pose de alça representa o local da palma da mão do usuário, detectada por um HoloLens ou segurando um controlador de movimento.
Em headsets imersivos, a pose de alça é melhor usada para renderizar a mão do usuário ou um objeto segurado na mão do usuário. A pose de alça também é usada ao visualizar um controlador de movimento. O modelo renderizável fornecido pelo Windows para um controlador de movimento usa a pose de alça como sua origem e centro de rotação.
A pose de alça é definida especificamente da seguinte maneira:
- A posição da empunhadura: O centróide da palma da mão ao segurar o controlador naturalmente, ajustado para a esquerda ou para a direita para centralizar a posição dentro da empunhadura. No controlador de movimento Windows Mixed Reality, essa posição geralmente se alinha com o botão Agarrar.
- O eixo direito da orientação da alça: quando você abre completamente a mão para formar uma pose plana de 5 dedos, o raio que é normal para a palma da mão (para frente a partir da palma esquerda, para trás a partir da palma direita)
- O eixo para frente da orientação da alça: quando você fecha a mão parcialmente (como se estivesse segurando o controle), o raio que aponta "para frente" através do tubo formado por seus dedos que não são polegares.
- O eixo para cima da orientação da alça: o eixo para cima implícito nas definições para a direita e para frente.
Você pode acessar a pose de alça por meio da API de entrada entre fornecedores do Unity (XR. InputTracking. GetLocalPosition/Rotation) ou por meio da API específica do Windows MR (sourceState.sourcePose.TryGetPosition/Rotation, solicitando dados de pose para o nó Grip ).
Pose do ponteiro
A pose do ponteiro representa a ponta do controlador apontando para frente.
A pose de ponteiro fornecida pelo sistema é melhor usada para raycast quando você está renderizando o próprio modelo do controlador. Se você estiver renderizando algum outro objeto virtual no lugar do controlador, como uma arma virtual, deverá apontar com um raio que seja mais natural para esse objeto virtual, como um raio que viaja ao longo do cano do modelo de arma definido pelo aplicativo. Como os usuários podem ver o objeto virtual e não o controlador físico, apontar com o objeto virtual provavelmente será mais natural para aqueles que usam seu aplicativo.
Atualmente, a pose do ponteiro está disponível no Unity somente por meio da API específica do Windows MR, sourceState.sourcePose.TryGetPosition/Rotation, passando InteractionSourceNode.Pointer como o argumento.
OpenXR
Você tem acesso a dois conjuntos de poses por meio de interações de entrada do OpenXR:
- As poses de alça para renderizar objetos na mão
- O objetivo é apontar para o mundo.
Mais informações sobre esse design e as diferenças entre as duas poses podem ser encontradas na Especificação OpenXR – Subcaminhos de Entrada.
As poses fornecidas pelo InputFeatureUsages DevicePosition, DeviceRotation, DeviceVelocity e DeviceAngularVelocity representam a pose de alça do OpenXR. InputFeatureUsages relacionados a poses de alça são definidos em CommonUsages do Unity.
As poses fornecidas pelo InputFeatureUsages PointerPosition, PointerRotation, PointerVelocity e PointerAngularVelocity representam a pose de mira do OpenXR. Esses InputFeatureUsages não são definidos em nenhum arquivo C# incluído, portanto, você precisará definir seus próprios InputFeatureUsages da seguinte maneira:
public static readonly InputFeatureUsage<Vector3> PointerPosition = new InputFeatureUsage<Vector3>("PointerPosition");
Háptica
Para obter informações sobre como usar hápticos no sistema de entrada XR do Unity, a documentação pode ser encontrada no Manual do Unity para Unity XR Input - Haptics.
Estado de rastreamento do controlador
Assim como os fones de ouvido, o controlador de movimento Windows Mixed Reality não requer nenhuma configuração de sensores de rastreamento externos. Em vez disso, os controladores são rastreados por sensores no próprio fone de ouvido.
Se o usuário mover os controladores para fora do campo de exibição do fone de ouvido, o Windows continuará a inferir as posições do controlador na maioria dos casos. Quando o controlador perder o rastreamento visual por tempo suficiente, as posições do controlador cairão para posições de precisão aproximada.
Neste ponto, o sistema bloqueará o corpo do controlador para o usuário, rastreando a posição do usuário enquanto ele se move, enquanto ainda expõe a verdadeira orientação do controlador usando seus sensores de orientação internos. Muitos aplicativos que usam controladores para apontar e ativar elementos da interface do usuário podem operar normalmente com precisão aproximada sem que o usuário perceba.
Raciocinando sobre o estado de rastreamento explicitamente
Os aplicativos que desejam tratar as posições de forma diferente com base no estado de rastreamento podem ir além e inspecionar propriedades no estado do controlador, como SourceLossRisk e PositionAccuracy:
Estado de rastreamento | SourceLossRisk | Precisão de posição | TryGetPosition |
---|---|---|---|
Alta precisão | < 1.0 | Alto | true |
Alta precisão (em risco de perda) | == 1.0 | Alto | true |
Precisão aproximada | == 1.0 | Aproximado | true |
Sem posição | == 1.0 | Aproximado | false |
Esses estados de rastreamento do controlador de movimento são definidos da seguinte maneira:
- Alta precisão: embora o controlador de movimento esteja dentro do campo de visão do fone de ouvido, ele geralmente fornecerá posições de alta precisão, com base no rastreamento visual. Um controlador em movimento que sai momentaneamente do campo de visão ou é momentaneamente obscurecido dos sensores do fone de ouvido (por exemplo, pela outra mão do usuário) continuará a retornar poses de alta precisão por um curto período de tempo, com base no rastreamento inercial do próprio controlador.
- Alta precisão (em risco de perda): quando o usuário move o controlador de movimento além da borda do campo de visão do fone de ouvido, o fone de ouvido logo não conseguirá rastrear visualmente a posição do controlador. O aplicativo sabe quando o controlador atingiu esse limite de FOV vendo o SourceLossRisk atingir 1.0. Nesse ponto, o aplicativo pode optar por pausar os gestos do controlador que exigem um fluxo constante de poses de alta qualidade.
- Precisão aproximada: quando o controlador perde o rastreamento visual por tempo suficiente, as posições do controlador caem para posições de precisão aproximada. Neste ponto, o sistema bloqueará o corpo do controlador para o usuário, rastreando a posição do usuário enquanto ele se move, enquanto ainda expõe a verdadeira orientação do controlador usando seus sensores de orientação internos. Muitos aplicativos que usam controladores para apontar e ativar elementos da interface do usuário podem operar normalmente com precisão aproximada sem que o usuário perceba. Aplicativos com requisitos de entrada mais pesados podem optar por detectar essa queda de alta precisão para precisão aproximada inspecionando a propriedade PositionAccuracy , por exemplo, para fornecer ao usuário uma hitbox mais generosa em destinos fora da tela durante esse período.
- Sem posição: Embora o controlador possa operar com precisão aproximada por um longo tempo, às vezes o sistema sabe que mesmo uma posição travada no corpo não é significativa no momento. Por exemplo, um controlador que foi ativado pode nunca ter sido observado visualmente, ou um usuário pode colocar um controlador que é então pego por outra pessoa. Nesses momentos, o sistema não fornecerá nenhuma posição para o aplicativo e TryGetPosition retornará false.
APIs comuns do Unity (Input.GetButton/GetAxis)
Namespace: UnityEngine, UnityEngine.XR
Tipos: Entrada, XR. Rastreamento de entrada
Atualmente, o Unity usa suas APIs gerais Input.GetButton/Input.GetAxis para expor a entrada para o Oculus SDK, o OpenVR SDK e o Windows Mixed Reality, incluindo mãos e controladores de movimento. Se seu aplicativo usar essas APIs para entrada, ele poderá dar suporte facilmente a controladores de movimento em vários SDKs XR, incluindo Windows Mixed Reality.
Obtendo o estado pressionado de um botão lógico
Para usar as APIs de entrada gerais do Unity, você normalmente começará conectando botões e eixos a nomes lógicos no Gerenciador de Entrada do Unity, associando um botão ou IDs de eixo a cada nome. Em seguida, você pode escrever um código que se refira a esse nome lógico de botão/eixo.
Por exemplo, para mapear o botão de gatilho do controlador de movimento esquerdo para a ação Enviar, vá para Editar > Entrada de Configurações > do Projeto no Unity e expanda as propriedades da seção Enviar em Eixos. Altere a propriedade Botão Positivo ou Alt Botão Positivo para ler o botão do joystick 14, assim:
Gerenciador de Entrada do Unity
Seu script pode verificar a ação Enviar usando Input.GetButton:
if (Input.GetButton("Submit"))
{
// ...
}
Você pode adicionar mais botões lógicos alterando a propriedade Tamanho em Eixos.
Obtendo o estado pressionado de um botão físico diretamente
Você também pode acessar os botões manualmente por seu nome totalmente qualificado, usando Input.GetKey:
if (Input.GetKey("joystick button 8"))
{
// ...
}
Obtendo uma pose de mão ou controle de movimento
Você pode acessar a posição e a rotação do controlador, usando XR. Rastreamento de entrada:
Vector3 leftPosition = InputTracking.GetLocalPosition(XRNode.LeftHand);
Quaternion leftRotation = InputTracking.GetLocalRotation(XRNode.LeftHand);
Observação
O código acima representa a pose de empunhadura do controlador (onde o usuário segura o controlador), o que é útil para renderizar uma espada ou arma na mão do usuário ou um modelo do próprio controlador.
A relação entre essa pose de alça e a pose do ponteiro (em que a ponta do controlador está apontando) pode diferir entre os controladores. Neste momento, acessar a pose do ponteiro do controlador só é possível por meio da API de entrada específica do MR, descrita nas seções abaixo.
APIs específicas do Windows (XR. WSA. Entrada)
Cuidado
Se o seu projeto estiver usando qualquer um dos arquivos XR. WSA, elas estão sendo descontinuadas em favor do XR SDK em versões futuras do Unity. Para novos projetos, recomendamos usar o SDK XR desde o início. Você pode encontrar mais informações sobre o sistema de entrada XR e APIs aqui.
Namespace: UnityEngine.XR.WSA.Input
Tipos: InteractionManager, InteractionSourceState, InteractionSource, InteractionSourceProperties, InteractionSourceKind, InteractionSourceLocation
Para obter informações mais detalhadas sobre Windows Mixed Reality entrada manual (para HoloLens) e controladores de movimento, você pode optar por usar as APIs de entrada espacial específicas do Windows no namespace UnityEngine.XR.WSA.Input . Isso permite que você acesse informações adicionais, como precisão de posição ou o tipo de fonte, permitindo que você diferencie mãos e controladores.
Sondagem para o estado das mãos e controladores de movimento
Você pode sondar o estado desse quadro para cada fonte de interação (mão ou controlador de movimento) usando o método GetCurrentReading .
var interactionSourceStates = InteractionManager.GetCurrentReading();
foreach (var interactionSourceState in interactionSourceStates) {
// ...
}
Cada InteractionSourceState que você recebe de volta representa uma fonte de interação no momento atual. O InteractionSourceState expõe informações como:
Que tipos de pressionamentos estão ocorrendo (Selecionar/Menu/Agarrar/Touchpad/Thumbstick)
if (interactionSourceState.selectPressed) { // ... }
Outros dados específicos dos controladores de movimento, como as coordenadas XY do touchpad e/ou do thumbstick e o estado tocado
if (interactionSourceState.touchpadTouched && interactionSourceState.touchpadPosition.x > 0.5) { // ... }
O InteractionSourceKind para saber se a origem é uma mão ou um controlador de movimento
if (interactionSourceState.source.kind == InteractionSourceKind.Hand) { // ... }
Sondagem para poses de renderização previstas para o futuro
Ao sondar dados de origem de interação de mãos e controladores, as poses que você obtém são poses previstas para o momento em que os fótons desse quadro alcançarão os olhos do usuário. As poses previstas para frente são mais bem usadas para renderizar o controlador ou um objeto retido a cada quadro. Se você estiver direcionando uma determinada imprensa ou comunicado com o controlador, isso será mais preciso se você usar as APIs de eventos históricos descritas abaixo.
var sourcePose = interactionSourceState.sourcePose; Vector3 sourceGripPosition; Quaternion sourceGripRotation; if ((sourcePose.TryGetPosition(out sourceGripPosition, InteractionSourceNode.Grip)) && (sourcePose.TryGetRotation(out sourceGripRotation, InteractionSourceNode.Grip))) { // ... }
Você também pode obter a pose de cabeça prevista para frente para este quadro atual. Assim como acontece com a pose de origem, isso é útil para renderizar um cursor, embora o direcionamento de um determinado press ou release seja mais preciso se você usar as APIs de eventos históricos descritas abaixo.
var headPose = interactionSourceState.headPose; var headRay = new Ray(headPose.position, headPose.forward); RaycastHit raycastHit; if (Physics.Raycast(headPose.position, headPose.forward, out raycastHit, 10)) { var cursorPos = raycastHit.point; // ... }
Manipulando eventos de origem de interação
Para lidar com eventos de entrada à medida que eles acontecem com seus dados de pose históricos precisos, você pode lidar com eventos de origem de interação em vez de sondagem.
Para lidar com eventos de origem de interação:
Registre-se para um evento de entrada InteractionManager . Para cada tipo de evento de interação em que você está interessado, você precisa se inscrever nele.
InteractionManager.InteractionSourcePressed += InteractionManager_InteractionSourcePressed;
Manipule o evento. Depois de se inscrever em um evento de interação, você receberá o retorno de chamada quando apropriado. No exemplo SourcePressed, isso ocorrerá depois que a origem for detectada e antes de ser liberada ou perdida.
void InteractionManager_InteractionSourceDetected(InteractionSourceDetectedEventArgs args) var interactionSourceState = args.state; // args.state has information about: // targeting head ray at the time when the event was triggered // whether the source is pressed or not // properties like position, velocity, source loss risk // source id (which hand id for example) and source kind like hand, voice, controller or other }
Como parar de manipular um evento
Você precisa parar de manipular um evento quando não estiver mais interessado no evento ou estiver destruindo o objeto que se inscreveu no evento. Para parar de manipular o evento, cancele a assinatura do evento.
InteractionManager.InteractionSourcePressed -= InteractionManager_InteractionSourcePressed;
Lista de eventos de origem de interação
Os eventos de origem de interação disponíveis são:
- InteractionSourceDetected (a origem se torna ativa)
- InteractionSourceLost (torna-se inativo)
- InteractionSourcePressed (toque, pressionamento de botão ou "Selecionar" pronunciado)
- InteractionSourceReleased (fim de um toque, botão liberado ou final de "Selecionar" pronunciado)
- InteractionSourceUpdated (move ou altera algum estado)
Eventos para poses de segmentação históricas que correspondem com mais precisão a uma imprensa ou comunicado
As APIs de sondagem descritas anteriormente fornecem ao seu aplicativo poses previstas para o futuro. Embora essas poses previstas sejam melhores para renderizar o controlador ou um objeto portátil virtual, as poses futuras não são ideais para segmentação, por dois motivos principais:
- Quando o usuário pressiona um botão em um controlador, pode haver cerca de 20 ms de latência sem fio por Bluetooth antes que o sistema receba o pressionamento.
- Então, se você estiver usando uma pose prevista para frente, haveria outros 10 a 20 ms de previsão direta aplicada para direcionar o momento em que os fótons do quadro atual alcançarão os olhos do usuário.
Isso significa que a sondagem fornece uma pose de origem ou pose de cabeça que está 30-40 ms à frente de onde a cabeça e as mãos do usuário realmente estavam de volta quando a imprensa ou liberação aconteceu. Para a entrada manual do HoloLens, embora não haja atraso de transmissão sem fio, há um atraso de processamento semelhante para detectar a imprensa.
Para direcionar com precisão com base na intenção original do usuário para um pressionamento manual ou de controle, você deve usar a pose de origem histórica ou a pose de cabeça desse evento de entrada InteractionSourcePressed ou InteractionSourceReleased .
Você pode direcionar um press ou comunicado com dados históricos de pose da cabeça do usuário ou de seu controlador:
A pose da cabeça no momento em que ocorreu um gesto ou pressionamento do controlador, que pode ser usada para direcionar para determinar o que o usuário estava olhando :
void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs args) { var interactionSourceState = args.state; var headPose = interactionSourceState.headPose; RaycastHit raycastHit; if (Physics.Raycast(headPose.position, headPose.forward, out raycastHit, 10)) { var targetObject = raycastHit.collider.gameObject; // ... } }
A pose de origem no momento em que ocorreu um pressionamento do controlador de movimento, que pode ser usada para direcionar para determinar para o que o usuário estava apontando o controlador. Este será o estado do controlador que experimentou a imprensa. Se você estiver renderizando o próprio controlador, poderá solicitar a pose do ponteiro em vez da pose de alça, para disparar o raio de destino do que o usuário considerará a ponta natural desse controlador renderizado:
void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs args) { var interactionSourceState = args.state; var sourcePose = interactionSourceState.sourcePose; Vector3 sourceGripPosition; Quaternion sourceGripRotation; if ((sourcePose.TryGetPosition(out sourceGripPosition, InteractionSourceNode.Pointer)) && (sourcePose.TryGetRotation(out sourceGripRotation, InteractionSourceNode.Pointer))) { RaycastHit raycastHit; if (Physics.Raycast(sourceGripPosition, sourceGripRotation * Vector3.forward, out raycastHit, 10)) { var targetObject = raycastHit.collider.gameObject; // ... } } }
Exemplo de manipuladores de eventos
using UnityEngine.XR.WSA.Input;
void Start()
{
InteractionManager.InteractionSourceDetected += InteractionManager_InteractionSourceDetected;
InteractionManager.InteractionSourceLost += InteractionManager_InteractionSourceLost;
InteractionManager.InteractionSourcePressed += InteractionManager_InteractionSourcePressed;
InteractionManager.InteractionSourceReleased += InteractionManager_InteractionSourceReleased;
InteractionManager.InteractionSourceUpdated += InteractionManager_InteractionSourceUpdated;
}
void OnDestroy()
{
InteractionManager.InteractionSourceDetected -= InteractionManager_InteractionSourceDetected;
InteractionManager.InteractionSourceLost -= InteractionManager_InteractionSourceLost;
InteractionManager.InteractionSourcePressed -= InteractionManager_InteractionSourcePressed;
InteractionManager.InteractionSourceReleased -= InteractionManager_InteractionSourceReleased;
InteractionManager.InteractionSourceUpdated -= InteractionManager_InteractionSourceUpdated;
}
void InteractionManager_InteractionSourceDetected(InteractionSourceDetectedEventArgs args)
{
// Source was detected
// args.state has the current state of the source including id, position, kind, etc.
}
void InteractionManager_InteractionSourceLost(InteractionSourceLostEventArgs state)
{
// Source was lost. This will be after a SourceDetected event and no other events for this
// source id will occur until it is Detected again
// args.state has the current state of the source including id, position, kind, etc.
}
void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs state)
{
// Source was pressed. This will be after the source was detected and before it is
// released or lost
// args.state has the current state of the source including id, position, kind, etc.
}
void InteractionManager_InteractionSourceReleased(InteractionSourceReleasedEventArgs state)
{
// Source was released. The source would have been detected and pressed before this point.
// This event will not fire if the source is lost
// args.state has the current state of the source including id, position, kind, etc.
}
void InteractionManager_InteractionSourceUpdated(InteractionSourceUpdatedEventArgs state)
{
// Source was updated. The source would have been detected before this point
// args.state has the current state of the source including id, position, kind, etc.
}
Controladores de movimento no MRTK
Você pode acessar o controlador de gestos e movimentos no gerenciador de entrada.
Acompanhe com tutoriais
Tutoriais passo a passo, com exemplos de personalização mais detalhados, estão disponíveis na Mixed Reality Academy:
Entrada MR 213 - Controlador de movimento
Próximo ponto de verificação de desenvolvimento
Se você estiver seguindo a jornada de desenvolvimento do Unity que apresentamos, estará explorando os principais blocos de construção do MRTK. Deste ponto, você pode prosseguir para o próximo bloco de construção:
Ou vá diretamente para as funcionalidades e APIs da plataforma de Realidade Misturada:
Você sempre pode voltar para os pontos de verificação de desenvolvimento do Unity a qualquer momento.