El uso de desplazamiento de bits le permite tener en cuenta varias capas en una operación física:
Physics.Raycast(ray, out hitInfo, Mathf.Infinity, layerMask )
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:
layerMask = (1 << LayerMask.NameToLayer("MyLayer1")) | (1 << LayerMask.NameToLayer("MyLayer2")) ;
También puede emitir rayos en todas las capas, excepto las específicas:
layerMask = (1 << LayerMask.NameToLayer("MyLayer1")) | (1 << LayerMask.NameToLayer("MyLayer2")) ;
layerMask = ~layerMask;
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:
Debug.Log( LayerMask.GetMask("UserLayerA", "UserLayerB") ) ;
Suponer UserLayerA
y UserLayerB
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