Version: 2020.1
Unpacking Prefab instances
Detección de colisión basado en Layers (capas)

Capas (Layers)

Los__Layers__ son comúnmente utilizados por Cameras para renderizar solo una parte de la escena, y por las Lights para iluminar solo partes de la escena. Pero también pueden ser utilizados por raycasting para selectivamente ignorar los colliders o crear collisions.

Creando Capas

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.

Asignar las Capas

Now that you have created a new layer, you have to assign the layer to one of the GameObjects.

In the Tags and Layers window, the Player layer is assigned to layer 8.

Drawing only a part of the Scene with the Camera’s culling mask

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.

Emitiendo Rayos Selectivamente

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

Unpacking Prefab instances
Detección de colisión basado en Layers (capas)