Finalmente descubrí por qué mis máscaras de capa para mi código de colisión en el suelo no funcionaban. Estaba usando NameToLayer()
para obtener la capa que necesitaba, pero las máscaras de capa usan desplazamiento de bits para establecer realmente el valor de la máscara de capa. Esto es extremadamente inusual y no veo ninguna razón por la cual esto no se maneje en el código detrás. ¿Por qué tenemos que usar un código como este?
mask = 1 << LayerMask.NameToLayer("Default");
cuando algo como esto:
mask = LayerMask.NameToLayer("Default");
tiene más sentido intuitivo y funciona de forma similar al resto de la API de Unity?
Respuestas:
Esto es extremadamente eficiente. Eso es todo: comparar cadenas, ya que el ejemplo obvio es más lento por un factor de 10. Y los cálculos de física tienen que estar muy optimizados, por lo que es bueno que alguien que sabía lo que estaba sucediendo lo escribiera de esta manera.
Entonces, la pregunta obvia de seguimiento es: ¿por qué no está esto envuelto en un método auxiliar para manejar la conversión y el cambio de bits? Creo que en realidad nadie lo consiguió: he enrollado mi propia ingeniosa herramienta de ayuda y esa es la práctica común.
fuente
El uso de desplazamiento de bits le permite tener en cuenta varias capas en una operación física:
Sin un poco de desplazamiento, se le permitirá emitir en una sola capa. Si bien con el desplazamiento de bits, puede emitir en varias capas específicas:
También puede emitir rayos en todas las capas, excepto las específicas:
Si nos fijamos en el "Administrador de capas" en Unity, las capas se pueden ver como los índices de una matriz simple de una dimensión .
EDITAR: nunca lo había visto antes, pero la
LayerMask
clase tiene una función de utilidad para obtener la máscara de capa "calculada" dados los nombres de las capas:Suponer
UserLayerA
yUserLayerB
son las capas décima y undécima. Estos tendrán un valor de capa de usuario de 10 y 11. Para obtener su valor de máscara de capa, sus nombres se pueden pasar a GetMask. El argumento puede ser una lista de sus nombres o una serie de cadenas que almacenan sus nombres. En este caso, el valor de retorno será 2 ^ 10 + 2 ^ 11 = 3072.Enlace a la documentación: https://docs.unity3d.com/ScriptReference/LayerMask.GetMask.html
fuente
|
lugar de la suma de enteros+
al hacer la unión de máscaras, la suma de enteros puede producir un comportamiento inesperado.LayerMask.NamesToLayers(params string[] layerNames)