Partilhar via


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
    }
}

Consulte também