Sistemas de coordenadas espaciais persistentes

Em geral, os benefícios dos recursos de persistência do World Locking Tools são mais interessantes do que os detalhes da implementação.

Portanto, este artigo começará com uma discussão sobre as experiências que a persistência do World Locking Tools permite. Depois disso, veremos como a persistência de Estado do World Locking Tools pode ser gerenciada. Em seguida, encerraremos com um breve esboço de quais dados são salvos e carregados.

O World Locking Tools entre sessões

Conforme definido em outra sessão, o Estado Congelado se refere a todos os dados necessários para retomar o espaço estável com bloqueio de mundo atual.

A principal utilidade da persistência do World Locking Tools é permitir que os benefícios do trabalho de uma sessão preliminar, da varredura de uma área e do alinhamento do espaço virtual com o mundo real sejam usados em sessões subsequentes.

A restauração desse estado permite que as sessões subsequentes renunciem a configurações monótonas ou demoradas e vão direto para a experiência focal.

Como Salvar o Estado do World Locking Tools

Antes de ser carregado, o Estado Congelado deve ser salvo.

A maneira mais direta de salvar o Estado Congelado é habilitar o Salvamento Automático no Gerenciador do World Locking Tools, seja no inspetor do Unity no Contexto do World Locking Tools ou em runtime por meio do script.

O estado do Gerenciador do World Locking Tools é definido por meio do script primeiro obtendo o estado, alterando-o de qualquer maneira desejada e, em seguida, definindo o estado de volta como bloco. Por exemplo, para alternar o recurso Salvamento Automático:

var settings = WorldLockingManger.GetInstance().Settings;
settings.AutoSave = !settings.AutoSave;
WorldLockingManager.GetInstance().Settings = settings;

Se o recurso Salvamento Automático passar de habilitado para desabilitado durante uma sessão, não haverá outra tentativa de salvamento periódico. Se passar de desabilitado para habilitado, os salvamentos periódicos serão iniciados ou retomados.

O recurso Salvamento Automático manterá um estado salvo atualizado salvando periodicamente o estado atual de forma assíncrona.

Se for necessário ter mais controle sobre o tempo de salvamento do estado, o Salvamento Automático poderá ser definido como false e o salvamento manual poderá ser feito por meio do script. O salvamento assíncrono é disparado facilmente, como:

WorldLockingManager.GetInstance().Save();

Como o salvamento é assíncrono, outras tentativas de invocar Save() serão ignoradas, enquanto um salvamento anterior ainda estiver em andamento.

Como carregar o Estado Congelado

Depois de salvar um Estado Congelado, você pode desejar recarregar o World Locking Tools de volta para esse estado, em uma sessão subsequente ou até mesmo mais tarde na mesma sessão.

Como vemos no salvamento do Estado Congelado, há dois caminhos para carregar o estado.

Se o sinalizador de Carregamento Automático no Gerenciador do World Locking Tools estiver habilitado, qualquer estado salvo anterior será carregado no momento da inicialização. Se não houver um estado salvo para carregar, nenhum erro será gerado e a inicialização prosseguirá como se o sinalizador não tivesse sido definido.

Alterar a definição do sinalizador de Carregamento Automático de false para true (por exemplo, por meio do script) em runtime não terá efeito. O Carregamento Automático ocorre no carregamento inicial ou não ocorre de forma alguma.

No entanto, um cargamento pode ser iniciado no script a qualquer momento por meio da função Carregamento do Gerenciador do World Locking Tools:

WorldLockingManager.GetInstance().Load();

Assim como ocorre no Salvamento, o Carregamento é executado de forma assíncrona. As chamadas subsequentes para o Carregamento serão ignoradas, enquanto um carregamento ainda estiver em andamento.

O que é salvo?

Os dados necessários para reconstruir o mapeamento do World Locking Tools, ou seja, o alinhamento do mundo virtual com o mundo real, podem ser divididos em quatro grupos.

  • Âncoras Espaciais – a rede subjacente de âncoras espaciais criada e mantida internamente pelo Gerenciador de Âncoras do World Locking Tools fornece a associação necessária com o mundo real. Essas âncoras são persistentes por meio do mecanismo de armazenamento subjacente da plataforma.

  • Estado do Mecanismo – o estado do mecanismo é persistente para permitir que o mecanismo retome o mapeamento atual. Restaurar esse estado remove indeterminações como a pose inicial da cabeça nas sessões anteriores.

  • Marcação de Espaço – se o aplicativo tiver aplicado mais Marcadores de Espaço para forçar o alinhamento das coordenadas de modelagem com o mundo real em um conjunto discreto de pontos, esse mapeamento também será persistente.

  • Espaço de Coordenadas: o World Locking Tools persiste o espaço de coordenadas em relação ao mundo físico salvando um grafo interno de âncoras espaciais locais.

O que não é salvo?

As configurações não estão salvas e o World Locking Tools não salva nem restaura os objetos de aplicativo individuais. Somente o estado é salvo. Todas as alterações de configuração pelo aplicativo, por exemplo, alterações feitas por meio da API WorldLockingManager, são redefinidas para os valores conforme definido no Inspetor do Unity sempre que o aplicativo é iniciado. Ou, se elas não forem definidas no Inspetor, serão definidas com os valores padrão no código.

Por exemplo, digamos que o aplicativo deseja apresentar ao usuário a opção de Salvamento Automático do estado de Bloqueio de Mundo e fazer com que a preferência do usuário persista entre as sessões até que seja alterada. Em seguida, o aplicativo deve:

  1. Apresentar ao usuário a experiência do usuário para definir a preferência de Salvamento Automático (presumidamente com outras configurações do aplicativo).
  2. Encaminhar a preferência do usuário para o WorldLockingManager.
  3. Registrar a preferência no arquivo (presumidamente com outras configurações do aplicativo).
  4. Na inicialização do aplicativo, carregue a preferência salva (se houver uma salva) e encaminhe para o WorldLockingManager.

Confira as observações em WorldLockingContext sobre problemas de tempo ao misturar a definição de estado entre ativos e script.

Confira também