Perda de rastreamento em Unity
Quando o dispositivo não consegue se localizar no mundo, o aplicativo experimenta "perda de rastreamento". Por padrão, o Unity pausará o loop de atualização e exibirá uma imagem inicial para o usuário sempre que o rastreamento for perdido. Uma vez que o rastreamento é recuperado, a imagem inicial desaparece e o loop de atualização continua.
Como alternativa, o usuário pode manipular manualmente essa transição desativando a configuração. Todo o conteúdo parecerá tornar-se corpo bloqueado durante a perda de rastreamento se nada for feito para lidar com ele.
Tratamento por defeito
O loop de atualização e todas as mensagens e eventos serão interrompidos durante o período de rastreamento de perda por padrão. Ao mesmo tempo, uma imagem será exibida para o usuário. Pode personalizar esta imagem acedendo a Edit-Settings-Player>>, clicando em Splash Image e definindo a imagem Holographic Tracking Loss.
Movimentação Manual
Para lidar manualmente com a perda de rastreamento, você precisa ir para Editar>configurações do>projeto Player>Guia de configurações>da Plataforma Universal do Windows Splash Image>Windows Holographic e desmarque "On Tracking Loss Pause and Show Image". Depois disso, você precisa lidar com o controle de alterações com as APIs especificadas abaixo.
Espaço de nomes: UnityEngine.XR.WSA
Tipo: WorldManager
- O World Manager expõe um evento para detetar o rastreamento perdido/ganho (WorldManager.OnPositionalLocatorStateChanged) e uma propriedade para consultar o estado atual (WorldManager.state)
- Quando o estado de rastreamento não está ativo, a câmera não parece traduzir no mundo virtual, mesmo quando o usuário traduz. Os objetos não corresponderão mais a nenhum local físico e todos aparecerão bloqueados.
Ao lidar com o controle de alterações por conta própria, você precisa pesquisar a propriedade state de cada quadro ou manipular o evento OnPositionalLocatorStateChanged .
Consultas
O estado mais importante é PositionalLocatorState.Ative, o que significa que o rastreamento é totalmente funcional. Qualquer outro estado resultará em apenas deltas rotacionais para a câmera principal. Por exemplo:
void Update()
{
switch (UnityEngine.XR.WSA.WorldManager.state)
{
case PositionalLocatorState.Active:
// handle active
break;
case PositionalLocatorState.Activating:
case PositionalLocatorState.Inhibited:
case PositionalLocatorState.OrientationOnly:
case PositionalLocatorState.Unavailable:
default:
// only rotational information is available
break;
}
}
Manipulando o evento OnPositionalLocatorStateChanged
Mais convenientemente, você também pode se inscrever em OnPositionalLocatorStateChanged para lidar com as transições:
void Start()
{
UnityEngine.XR.WSA.WorldManager.OnPositionalLocatorStateChanged += WorldManager_OnPositionalLocatorStateChanged;
}
private void WorldManager_OnPositionalLocatorStateChanged(PositionalLocatorState oldState, PositionalLocatorState newState)
{
if (newState == PositionalLocatorState.Active)
{
// Handle becoming active
}
else
{
// Handle becoming rotational only
}
}