Como controlar a perda no Unity

Quando o dispositivo não consegue se localizar no mundo, o aplicativo experimenta a "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 ao recusar a configuração. Todo o conteúdo parecerá estar 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 o acompanhamento da perda 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 de Perda de Rastreamento Holográfico.

Manipulação manual

Para lidar manualmente com a perda de rastreamento, você precisa ir para Editar> Player deConfigurações>> do Projeto Plataforma Universal do Windows guia> ConfiguraçõesImagem> inicialWindows Holographic e desmarcar "Ao rastrear perda pausar e mostrar imagem". Depois disso, você precisa lidar com o controle de alterações com as APIs especificadas abaixo.

Namespace:UnityEngine.XR.WSA
Type: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 aparecerá para 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 pelo corpo.

Ao lidar com alterações de controle por conta própria, você precisa sondar a propriedade de estado de cada quadro ou manipular o evento OnPositionalLocatorStateChanged .

Sondagem

O estado mais importante é PositionalLocatorState.Active, o que significa que o acompanhamento é totalmente funcional. Qualquer outro estado resultará apenas em deltas rotacionais para a câmera main. 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 assinar 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
    }
}

Confira também