Finalmente descobri por que minhas máscaras de camada para o meu código de colisão no solo não estavam funcionando. Eu estava usando NameToLayer()
para obter a camada de que precisava, mas as máscaras de camada usam deslocamento de bits para realmente definir o valor da máscara de camada. Isso é extremamente incomum e não vejo nenhuma razão para que isso não seja tratado no código por trás. Por que temos que usar código como este:
mask = 1 << LayerMask.NameToLayer("Default");
quando algo assim:
mask = LayerMask.NameToLayer("Default");
faz mais sentido intuitivo e funciona de maneira semelhante ao restante da API do Unity?
Respostas:
Isso é extremamente eficiente. É tudo o que existe - comparar strings, pois o exemplo óbvio é mais lento em um fator de 10. E os cálculos de física precisam ser muito otimizados, por isso é bom que alguém que sabia o que está acontecendo o tenha escrito dessa maneira.
Portanto, a pergunta óbvia de acompanhamento é: por que isso não está envolvido em um método auxiliar para lidar com a conversão e a mudança de bits? Eu acho que ninguém realmente conseguiu - criei meu próprio utilitário auxiliar bacana e essa é a prática comum.
fonte
O uso de deslocamento de bits permite levar em consideração várias camadas em uma operação física:
Sem troca de bits, você seria autorizado a transmitir raios em uma camada e apenas uma. Enquanto com a mudança de bits, você pode transmitir em raios em várias camadas específicas:
Você também pode transmitir raios em todas as camadas, exceto as específicas:
Se você olhar para o "Gerenciador de camadas" no Unity, as camadas poderão ser vistas como os índices de uma matriz simples de uma dimensão .
EDIT: Eu nunca vi isso antes, mas a
LayerMask
classe tem uma função de utilitário para obter a máscara de camada "computada", dados os nomes das camadas:Suponha
UserLayerA
eUserLayerB
seja a décima e a décima primeira camadas. Eles terão um valor de camada de usuário de 10 e 11. Para obter o valor da máscara de camada, seus nomes podem ser passados para o GetMask. O argumento pode ser uma lista de seus nomes ou uma matriz de cadeias armazenando seus nomes. Nesse caso, o valor de retorno será 2 ^ 10 + 2 ^ 11 = 3072.Link para a documentação: https://docs.unity3d.com/ScriptReference/LayerMask.GetMask.html
fonte
|
vez de adição de número inteiro+
ao fazer a união de máscaras, a adição de número inteiro pode produzir um comportamento inesperado.LayerMask.NamesToLayers(params string[] layerNames)