Layers in Unity define which GameObjects can interact with different features and one another. They are most commonly used by Cameras to render only a part of the scene, and by Lights to illuminate only parts of the scene. But they can also be used by raycasting to selectively ignore colliders or to create collisions.
The first step is to create a new layer, which we can then assign to a GameObject. To create a new layer, open the Tags and Layers window (main menu: Edit > Project Settings, then select the Tags and Layers category).
Nosotros creamos una nueva capa en una de las capas de usuario vacías. Nosotros escogemos la capa 8.
Now that you have created a new layer, you can assign the layer to one or more GameObjects.
Each GameObject can only be assigned one layer.
In the Tags and Layers window, the Player layer is assigned to layer 8.
Utilizando la culling mask de la cámara, usted puede selectivamente renderizar objetos que están en una capa en particular. Para hacer esto, seleccione la cámara que debería selectivamente renderizar objetos.
Modifique la culling mask marcando o desmarcando capas en la propiedad de culling mask.
Tenga en cuenta que los elementos de UI no se seleccionan. Los hijos del Screen space canvas (lienzo del espacio de pantalla) no respetan la culling mask de la cámara.
Utilizando capas usted puede emitir rayos e ignorar los colliders en capas específicas. Por ejemplo, usted puede querer emitir un rayo solamente contra la capa del jugador e ignorar todos los otros colliders.
La función Physics.Raycast toma una máscara de bits, dónde cada bit determina si una capa va a ser ignorada o no. Si todos los bits en la layerMask están activados, colisionaremos contra todos los colliders. Si el layerMask = 0, nunca encontraremos ninguna colisión con ese rayo.
int layerMask = 1 << 8;
// Does the ray intersect any objects which are in the player layer.
if (Physics.Raycast(transform.position, Vector3.forward, Mathf.Infinity, layerMask))
{
Debug.Log("The ray hit the player");
}
En el mundo real, usted quiere hacer lo inverso de eso, no obstante, nosotros queremos emitir un rayo contra todos los colliders menos esos en la capa del jugador.
void Update ()
{
// Bit shift the index of the layer (8) to get a bit mask
int layerMask = 1 << 8;
// This would cast rays only against colliders in layer 8.
// But instead we want to collide against everything except layer 8. The ~ operator does this, it inverts a bitmask.
layerMask = ~layerMask;
RaycastHit hit;
// Does the ray intersect any objects excluding the player layer
if (Physics.Raycast(transform.position, transform.TransformDirection (Vector3.forward), out hit, Mathf.Infinity, layerMask))
{
Debug.DrawRay(transform.position, transform.TransformDirection (Vector3.forward) * hit.distance, Color.yellow);
Debug.Log("Did Hit");
}
else
{
Debug.DrawRay(transform.position, transform.TransformDirection (Vector3.forward) *1000, Color.white);
Debug.Log("Did not Hit");
}
}
Cuando usted no pasa una layerMask a la función Racast, solamente va a ignorar los colliders que no utilicen la capa IgnoreRayCast. Esta es la manera más fácil para ignorar algunos colliders cuándo emitan un rayo.
Note: Layer 31 se usa internamente por la mecánica de la ventana Previewdel Editor. Para evitar problemas, no use esta layer (capa).
2017–05–08 Page amended
Culling mask information updated in Unity 2017.1