Compartilhar via


Como lidar com condições excepcionais

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

Mas algumas condições excepcionais levam a erros aos quais o aplicativo pode querer se ajustar.

A perda de rastreamento é um exemplo dessas condições.

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 recursos visíveis ao redor da câmera para rastrear.

As discussões mais completas dessas condições excepcionais em um nível conceitual, incluindo os recursos do WLT destinados a mitigá-las, são encontradas em outras sessões desta documentação.

Aqui, analisaremos como o desenvolvedor de aplicativos pode (como opção) aproveitar esses recursos para personalizar o comportamento do aplicativo durante essas condições excepcionais.

AttachmentPoints

Conforme discutido mais detalhadamente aqui, um ponto de anexo é o contrato entre o WLT e o aplicativo, para notificação sobre a ocorrência de condições excepcionais, juntamente com os dados apropriados que o aplicativo pode usar para responder.

Componentes do ajustador

Uma implementação dessas respostas do aplicativo está disponível na forma dos componentes do "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 atuam em duas funções:

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

Gerenciamento de AttachmentPoint

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

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

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

Retornos de chamada de tratamento da condição

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

Tratamento do estado de rastreamento

No HandleStateAdjust(), o componente AdjusterFixed desabilita os 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 muitos aplicativos, é fácil imaginar casos em que isso não seria suficiente.

  1. O objeto deve estar oculto, mas não desabilitado (deve continuar a ser atualizado).
  2. É preferível um método alternativo de ocultação do objeto (por exemplo, movê-lo além do plano de recorte distante).
  3. Em vez de ocultar o objeto, ele deve ser renderizado com um material diferente (por exemplo, o material de raio-x).
  4. Em vez de ocultar o objeto, um objeto alternativo deve ser renderizado.
  5. Etc.

Felizmente, o desenvolvedor de aplicativos é gratuito para implementar qualquer um desses comportamentos ou outros comportamentos limitados apenas pela imaginação.

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

Tratamento de reposicionamento

Conforme descrito na documentação conceitual, o sistema WLT pode decidir que um objeto pode ser mais bem mantido na posição no mundo físico por meio do seu reposicionamento no espaço congelado. Ele informará o aplicativo sobre essa situação por meio do mecanismo de AttachmentPoint.

É claro que o aplicativo pode ignorar esses ajustes. No entanto, o comportamento apresentado 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 o que o aplicativo deseja. Logo, pode-se perguntar por que alguém desejaria substituir a função HandlePositionAdjust() do AdjusterFixed.

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

AdjusterFixed versus AdjusterMoving

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

A diferença entre os dois é que o AdjusterMoving pressupõe que o destino está sendo constantemente movido em todo o ambiente. Portanto, cada atualização notifica o sistema WLT da nova 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 "principalmente" estacionário e movido apenas raramente no script, pode ser interessante usar um componente AdjusterFixed e chamar AdjusterFixed.UpdatePosition() após toda vez que o objeto for movido.

Personalize o comportamento, mas somente se você quiser

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

  1. Atenda às necessidades do aplicativo.
  2. Forneça uma implementação de linha de base para você aprimorar.
  3. Forneça uma implementação de exemplo em que você possa ousar.

Confira também