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.

// Ejemplo JavaScript.

// bit shift el indice de la layer para obtener una bit mask
var layerMask = 1 << 8;
// El rayo se cruza con cualquier objeto que se encuentre en la layer (capa) del jugador.
if (Physics.Raycast (transform.position, Vector3.forward, Mathf.Infinity, layerMask))
    print ("The ray hit the player");


// Ejemplo C#.

int layerMask = 1 << 8;
        
// El rayo se cruza con cualquier objeto que se encuentre en la layer (capa) del jugador
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.


// Ejemeplo JavaScript.
function Update () {
  // Bit shift el indice de la layer (capa) (8) para obtener una  bit mask
  var layerMask = 1 << 8;
  // Esto lanzaría rayos solo contra colliders en la layer (capa) 8.
  // Pero en cambio queremos colisionar contra todo excepto la layer (capa) 8. El operador ~ hace esto, invierte una bitmask.
  layerMask = ~layerMask;

  var hit : RaycastHit;
  // El rayo se cruza con cualquier objeto que excluya la layer (capa) del jugador?
  if (Physics.Raycast (transform.position, transform.TransformDirection (Vector3.forward), hit, Mathf.Infinity, layerMask)) {
    Debug.DrawRay (transform.position, transform.TransformDirection (Vector3.forward) * hit.distance, Color.yellow);
    print ("Did Hit");
  } else {
    Debug.DrawRay (transform.position, transform.TransformDirection (Vector3.forward) *1000, Color.white);
    print ("Did not Hit");
  }
}


// Ejemplo C# .
void Update () {
    // Bit shift the index of the layer (8) to get a bit mask
    int layerMask = 1 << 8;
        
    // Esto lanzaría rayos solo contra colliders en la layer (capa) 8.
    // Pero en cambio queremos colisionar contra todo excepto la layer (capa) 8. El operador ~ hace esto, invierte una bitmask.
    layerMask = ~layerMask;
    
    RaycastHit hit;
    // El rayo se cruza con cualquier objeto que excluya la layer (capa) del jugador?
    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.


  • 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)