Partilhar via


Manuseamento de condições excecionais

Na maioria das vezes, o WLT pode detetar e corrigir erros de rastreamento silenciosamente sem o envolvimento do aplicativo.

No entanto, algumas condições excecionais conduzem a erros aos quais a aplicação poderá querer ajustar-se.

A perda de rastreamento é um exemplo de tal condição.

O rastreamento pode ser perdido a qualquer momento, por vários motivos. Os sensores podem estar cobertos, a iluminação pode ser inadequada ou pode não haver quaisquer características visíveis ao redor da câmera para que ela rastreie.

Discussões mais completas sobre essas condições excecionais em um nível conceitual, incluindo os recursos do WLT destinados a mitigá-las, estão contidas em outra parte desta documentação.

Aqui, vamos analisar como o desenvolvedor do aplicativo pode (opcionalmente) aproveitar esses recursos para personalizar o comportamento do aplicativo durante essas condições excecionais.

Pontos de Anexo

Como discutido mais detalhadamente aqui, um ponto de anexo é o contrato entre a WLT e o aplicativo, para notificação de que condições excecionais ocorreram, juntamente com os dados apropriados que o aplicativo pode usar para responder.

Componentes do ajustador

Uma implementação de tais respostas de aplicação está disponível na forma dos componentes "ajustador". O principal deles é o componente AdjusterFixed .

O AdjusterFixed pode ser usado como está, mas entender o que ele faz pode ser instrutivo, especialmente para um desenvolvedor que deseja personalizar ainda mais o comportamento.

É importante reconhecer que os componentes do Ajustador desempenham duas funções:

  1. Eles gerenciam o AttachmentPoint subjacente.
  2. Eles fornecem implementações das respostas do aplicativo a condições excecionais.

Gerenciamento do AttachmentPoint

Examinar o Start() e OnDestroy() membros captura a maior parte do gerenciamento do AttachmentPoint necessário.

No Start(), o AttachmentPoint subjacente é criado, dando ao membro do AdjusterFixed funções como retornos de chamada (veja abaixo).

No OnDestroy(), essas conexões de retorno de chamada são cortadas e o AttachmentPoint liberado.

Retornos de chamada de manipulação de condições

Os dois retornos de chamada implementam o comportamento desejado do aplicativo durante essas condições excecionais.

Manipulando o estado de rastreamento

No HandleStateAdjust(), o componente AdjusterFixed desabilita objetos contidos em um fragmento que não está sendo rastreado no momento.

        protected virtual void HandleAdjustState(AttachmentPointStateType state)
        {
            bool visible = state == AttachmentPointStateType.Normal;
            if (visible != gameObject.activeSelf)
            {
                gameObject.SetActive(visible);
            }
        }

Embora esse comportamento simples seja perfeito para muitas aplicações, é fácil imaginar casos em que não seria suficiente.

  1. O objeto deve estar oculto, mas não desativado (deve continuar a atualização).
  2. É preferível um método alternativo de ocultar o objeto (por exemplo, movendo-o para além do plano de corte distante).
  3. Em vez de esconder o objeto, ele deve ser renderizado com um material diferente (por exemplo, material de raios-X).
  4. Em vez de ocultar o objeto, um objeto alternativo deve ser renderizado.
  5. Etc.

Felizmente, o desenvolvedor do aplicativo é livre para implementar qualquer um desses comportamentos, ou outros comportamentos limitados apenas pela imaginação.

O meio mais simples de especificar o comportamento personalizado é implementar um componente personalizado derivado de AdjusterFixed. O gerenciamento AttachmentPoint pode ser herdado e os manipuladores substituídos para criar o comportamento personalizado.

Reposicionamento de manuseamento

Conforme descrito na documentação conceitual, o sistema WLT pode decidir que um objeto pode ser melhor mantido em sua posição no mundo físico reposicionando-o no espaço congelado. Informará a aplicação dessa situação através do mecanismo AttachmentPoint.

O aplicativo é, naturalmente, livre para ignorar tais ajustes. No entanto, o comportamento fornecido pelo componente AdjusterFixed (e AdjusterMoving) é aplicar essa transformação de reposicionamento imediatamente.

        protected virtual void HandleAdjustLocation(Pose adjustment)
        {
            Pose pose = gameObject.transform.GetGlobalPose();
            pose = adjustment.Multiply(pose);
            gameObject.transform.SetGlobalPose(pose);
        }

É quase sempre isso que a aplicação pretende. A pergunta pode ser feita, então, por que alguém gostaria de substituir a função do HandlePositionAdjust() AdjusterFixed.

A resposta, claro, é que o aplicativo pode querer executar outras ações além de corrigir a posição. Um efeito material temporário pode ajudar a notificar o usuário de que uma alteração foi feita. O reposicionamento pode ser estendido por alguns segundos. Ou se um reposicionamento for muito drástico, o aplicativo pode preferir descartar o objeto, em vez de movê-lo.

AjustadorFixo vs AjustadorMovendo

Uma análise mais detalhada do componente AdjusterMoving mostra que ele é quase idêntico ao componente AdjusterFixed do qual deriva.

A diferença entre os dois é que o AdjusterMoving assume que seu alvo está constantemente sendo movido pelo ambiente. Portanto, a cada atualização ele notifica o sistema WLT de seu novo Pose.

O custo do AdjusterMoving vem principalmente da adição de uma função Update(), em vez do trabalho feito dentro da função. No entanto, para um objeto que é "principalmente" estacionário e é movido apenas com pouca frequência do script, pode ser vantajoso usar um componente AdjusterFixed e chamar AdjusterFixed.UpdatePosition() após cada vez que o objeto é movido.

Personalize o comportamento, mas apenas se quiser

Mais uma vez, espera-se que o padrão aqui seja consistente em todas as World Locking Tools. O WLT fornece um comportamento de linha de base simples, mas geralmente útil. Espera-se que esta implementação:

  1. Satisfaça as necessidades da sua aplicação.
  2. Forneça uma implementação de linha de base para você aprimorar.
  3. Dê um exemplo de implementação a partir do qual você pode ficar louco.

Consulte também