Compartilhar via


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

Confira também