Definições de Contexto e Gestor das Ferramentas de Bloqueio Mundial

O Contexto das Ferramentas de Bloqueio Mundial permite a personalização paramétrica do World Locking Tools Manager no Inspetor do Unity.

Embora o componente WorldLockingContext apresente uma IU para o WorldLockingManager, é importante compreender que não são a mesma coisa e, em algumas situações, pode ser importante compreender a sua relação.

O Gestor é um singleton

O WorldLockingManager é um singleton criado a pedido e que persiste ao longo da duração da aplicação. Se não forem feitas chamadas para o WorldLockingManager, nunca será instanciada. Depois de instanciada, permanecerá em direto até que a aplicação seja encerrada. Nunca é destruído e instanciado novamente.

O WorldLockingManager não é um objeto unity, é uma classe C# genérica. A atualização é impulsionada por um componente proxy unity, uma instância da classe privada WorldLockingManager.UpdateProxy. De outra forma, é independente dos ciclos de criação/atualização/destruição do Unity.

O Contexto é um componente do Unity

O WorldLockingContext é um componente do Unity que é adicionado a um objeto na cena da forma habitual. Os campos são apresentados no Inspetor do Unity, tal como qualquer outro componente regular do Unity.

Embora não seja um erro ter vários WorldLockingContexts ativos numa única cena, provavelmente não é desejado, uma vez que o comportamento seria indefinido, dependendo da ordem desconhecida das cargas de objetos.

As definições num contexto são aplicadas quando o WorldLockingContext é carregado. Especificamente, o contexto envia as suas definições para o World Locking Tools Manager na sua chamada OnEnable e sempre que a sua cena se tornar a cena ativa. Este último é aplicado como parte da chamada de retorno Unity.SceneManager.activeSceneChanged, se e apenas se a nova cena ativa for a cena a que o contexto pertence.

Todas as definições podem ser aplicadas a partir do script

Em qualquer ponto do runtime, a aplicação pode aplicar definições personalizadas ao WorldLockingManager através do script. Se for necessária qualquer demolição e reconstrução de recursos para efetuar uma alteração nas definições, essa reconstrução ocorrerá imediatamente na alteração das definições.

Embora existam alguns membros de conveniência para obter valores de propriedade individuais do WorldLockingManager, por exemplo Guardar Automaticamente, a definição de parâmetros ocorre sempre em agregação. Por exemplo, o código para alternar as funcionalidades AutoMerge e AutoRefreeze poderá ter o seguinte aspeto:

/// Get a copy of the current settings
var settings = WorldLockingManager.GetInstance().Settings;
/// Modify the copy
settings.AutoMerge = !settings.AutoMerge;
settings.AutoRefreeze = !settings.AutoRefreeze;
/// Update the current settings to the values in the copy.
WorldLockingManager.GetInstance().Settings = settings;

Da mesma forma, para as definições de diagnóstico.

Tenha em atenção que alterar múltiplas definições de uma só vez só implica o custo de uma única reconstrução (se for necessário).

Precedência das definições

As regras para as definições atualmente aplicadas ao WorldLockingManager são muito simples:

  1. Se nenhuma cena que contenha um contexto tiver sido carregada e não tiverem sido definidas definições explicitamente a partir do script, o WorldLockingManager tem as predefinições.

  2. Uma definição manterá o respetivo valor até ser substituída por um WorldLockingContext carregado com uma cena ou por uma alteração explícita invocada da aplicação no script.

Deve ser utilizada atenção ao misturar as definições do World Locking Tools Manager a partir de contextos e definições de scripts. Uma vez que o contexto aplica sempre as suas definições de carga, um script que aplica manualmente a definição durante a carga, especialmente a partir da chamada de retorno OnEnable, provavelmente irá deparar-se com condições de corrida e comportamento indeterminado.

Definições disponíveis

As definições disponíveis para controlar o comportamento das Ferramentas de Bloqueio Mundial são divididas em grupos da seguinte forma.

Uma configuração básica do contexto de bloqueio do mundo

Definições de automatização

As definições de automatização controlam o comportamento do runtime do World Locking Tools Manager. Os campos disponíveis para modificação e as respetivas implicações estão documentados na classe ManagerSettings . Estão focados em ativar ou desativar ações periódicas automatizadas pelo gestor. Qualquer ação automatizada desativada pode ser executada manualmente.

A secção de automatização do contexto

Definições de ligação

As definições de ligação são utilizadas para definir explicitamente a cena GameObjects cujas transformações serão utilizadas para aplicar as correções das Ferramentas de Bloqueio Mundial.

A secção linkage do contexto

O campo "Utilizar Existente" permite que os objetos ligados sejam definidos uma vez na cena com a plataforma da câmara (com "Use Existing" false) e não sejam substituídos ao carregar cenas de conteúdo subsequentes (com "Utilizar Existente" verdadeiro).

Por outro lado, a definição "Utilizar Existente" como falso permite que várias cenas cada uma com uma plataforma de câmara diferente se liguem aos locais adequados na hierarquia da câmara.

Ao criar e gerir a hierarquia da câmara a partir do script, o campo "Utilizar Existente" deve ser definido como verdadeiro em todos os Contextos e as ligações são atualizadas explicitamente a partir da câmara que gere scripts.

Quando as transformações necessárias não são fornecidas, ou são deixadas nulas ou todos os Contextos têm "Utilizar Existente", o sistema emite um aviso e tenta inferir boas escolhas. Recomenda-se, mas não é necessário, definir explicitamente as transformações adequadas, em vez de ter a estimativa do sistema.

Existem duas opções adicionais aqui que controlam a forma como a correção de transformação da câmara será aplicada.

A primeira caixa de verificação, para "Aplicar Ajuste", tem a predefinição ativada. Isto indica ao sistema para aplicar a correção da câmara calculada a cada frame à "Moldura de Ajuste" GameObject. Desativar esta é uma funcionalidade muito avançada e só deve ser experimentada depois de todos os outros problemas serem resolvidos e ter sido alcançada uma compreensão profunda das Ferramentas de Bloqueio Mundial. Em suma, indica ao sistema que a correção da câmara não deve ser aplicada à câmara, mas será aplicada por outros meios. Normalmente, isto é através de um AlignSubtree componente, mas não tem de ser.

A segunda caixa de verificação, para "No Pitch And Roll", indica ao sistema para eliminar qualquer pitch e roll calculados na transformação de Playspace para Espaço Bloqueado. (Veja este debate sobre espaços de coordenadas WLT). Isto não tem qualquer efeito na rotação aplicada pelo SpacePin sistema, mas afeta apenas a transformação da câmara de bloqueio mundial calculada pelo Motor Mundial Congelado.

Definições de Gestão de Âncoras

A Gestão de Âncoras define toda a seleção explícita do sistema de controlo de âncora. Atualmente, esta seleção só é efetuada no arranque e, uma vez selecionada, não pode ser alterada.

Outras definições aqui permitem controlar a densidade do gráfico de âncora interno subjacente. Estes podem ser alterados em qualquer altura, embora o seu efeito possa demorar algum tempo a propagar através do gráfico interno.

Ao cobrir áreas muito grandes, poderá querer reduzir a densidade do gráfico de âncora interna para sacrificar a precisão do desempenho. Aumentar a MinNewAnchorDistance faz isso mesmo. Ao aumentar a distância mínima necessária antes de adicionar uma nova âncora interna, o espaçamento entre as âncoras aumenta e, por isso, a densidade das âncoras diminui.

Deve observar-se que, para passar no teste de criação de limites, o MaxAnchorEdgeLength tem de ser maior do que o MinNewAnchorDistance. Na prática, um MaxAnchorEdgeLength 10-20% maior do que o MinNewAnchorDistance funciona bem.

O parâmetro MaxLocalAnchors, em vez de modificar a densidade, limita diretamente o número de âncoras internas. Atualmente, quando a contagem de âncoras está acima do limite, as âncoras mais distantes da câmara são recicladas para reduzir o número. No entanto, outros algoritmos são interessantes e estão a ser investigados, pelo que uma aplicação não deve depender desta implementação específica.

A secção de gestão de âncora do contexto

Estão a ser documentados mais detalhes na estrutura AnchorSettings .

Definições de diagnóstico

As definições de Diagnóstico controlam a recolha de diagnósticos para análise de comportamento e depuração. Normalmente, devem ficar com o conjunto "Utilizar Predefinições", o que, entre outras coisas, desativa a coleção de diagnósticos. A coleção de diagnósticos é um ótimo arrasto de desempenho, pelo que deve ser evitada, a menos que seja necessário.

A secção de diagnóstico do contexto

Durante o desenvolvimento, quando está a ser observado um comportamento inesperado e indesejável, os dados de diagnóstico recolhidos ao desativar Utilizar Predefinições e ativar DiagnosticsSettings.Enabled irão ativar a recolha de dados que podem ser fundamentais para compreender e corrigir esse comportamento.

Os campos disponíveis para modificação estão descritos na classe DiagnosticsSettings .

Predefinições

As definições de gestor e diagnóstico contêm uma caixa de verificação "Utilizar Predefinições" nas definições. A propriedade "Utilizar Predefinições" também está disponível a partir do script.

Quando a propriedade "Utilizar Predefinições" é verdadeira, são utilizadas as predefinições atuais. Se os valores predefinidos de uma propriedade mudarem numa nova versão, a propriedade "Utilizar Predefinições" instrui o sistema a utilizar o novo valor de propriedade.

Definir a propriedade "Utilizar Predefinições" como verdadeira em qualquer altura irá repor todos os valores para os valores predefinidos atuais . Para bloquear os valores num instantâneo dos valores predefinidos num determinado momento, ative a propriedade "Utilizar Predefinições" para repor todos os campos para as predefinições atuais e, em seguida, desmarque a caixa de verificação para impedir que sejam alterados com uma atualização.

Sugere-se que deixe o "Utilizar Predefinições" definido como verdadeiro, exceto durante o desenvolvimento para experimentação e depuração.

Ver também