Optimizando el Tiempo de Carga del Shader
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

El primer paso es crear una nueva capa, que nosotros luego podemos asignar a un GameObject. Para crear una nueva capa (layer), abra el menú de edición (edit) y seleccione Project Settings->Tags and Layers.

Nosotros creamos una nueva capa en una de las capas de usuario vacías. Nosotros escogemos la capa 8.

Asignar las Capas

Ahora que ha creado una nueva capa, tiene que asignar la capa a uno de los game objects.

En el administrador de etiquetas hemos asignado la capa del jugador (Player Layer) a la capa 8.

Dibujar una sola parte de la escena con la culling mask de la cámara

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 with limited editorial review

  • Culling mask information updated in Unity 2017.1

Optimizando el Tiempo de Carga del Shader
Detección de colisión basado en Layers (capas)