Optimizing Shader Load Time
Detección de Colisiones Basadas en las 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.

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.

// JavaScript example.

// bit shift the index of the layer to get a bit mask
var 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))
    print ("The ray hit the player");


// C# example.

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.

// JavaScript example.
function Update () {
  // Bit shift the index of the layer (8) to get a bit mask
  var 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;

  var hit : RaycastHit;
  // Does the ray intersect any objects excluding the player layer
  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");
  }
}


// C# example.
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.

Optimizing Shader Load Time
Detección de Colisiones Basadas en las Capas.