Como controlar a perda no 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. Depois que o rastreamento é recuperado, a imagem inicial desaparece e o loop de atualização continua.
Como alternativa, o usuário pode lidar manualmente com essa transição recusando a configuração. Todo o conteúdo parecerá ficar bloqueado durante a perda de rastreamento se nada for feito para lidar com isso.
Tratamento padrão
O loop de atualização e todas as mensagens e eventos serão interrompidos durante a perda de rastreamento por padrão. Ao mesmo tempo, uma imagem será exibida para o usuário. Você pode personalizar essa imagem acessando Edit-Settings-Player>>, clicando em Imagem Inicial e definindo a imagem Perda de Rastreamento Holográfico.
Manuseio manual
Para lidar manualmente com a perda de rastreamento, você precisa ir para Editar>configurações do>projeto Player>Universal Windows Platform guia>Configurações Imagem inicial>Windows Holographic e desmarcar "Ao rastrear perda Pausar e mostrar imagem". Depois disso, você precisa lidar com as alterações de rastreamento com as APIs especificadas abaixo.
Namespace: UnityEngine.XR.WSA
Tipo: WorldManager
- O World Manager expõe um evento para detectar o rastreamento perdido/ganho (WorldManager.OnPositionalLocatorStateChanged) e uma propriedade para consultar o estado atual (WorldManager.state)
- Quando o estado de rastreamento não estiver ativo, a câmera não parecerá traduzir no mundo virtual, mesmo quando o usuário traduzir. Os objetos não corresponderão mais a nenhum local físico e todos aparecerão bloqueados no corpo.
Ao lidar com alterações de rastreamento por conta própria, você precisa sondar a propriedade state de cada quadro ou manipular o evento OnPositionalLocatorStateChanged .
Sondagem
O estado mais importante é PositionalLocatorState.Active, o que significa que o rastreamento é totalmente funcional. Qualquer outro estado resultará apenas em 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
}
}