Menu
CoddyTech

Capas y LayerMask

Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 36 de 63.

Cada GameObject está en una capa, seleccionada en el menú Layer de la parte superior del Inspector. Unity tiene 32: algunas vienen integradas (0 Default, 2 Ignore Raycast, 4 Water, 5 UI), y puedes nombrar las tuyas en Tags and Layers, empezando por User Layer 3. Un LayerMask es un conjunto de capas, un bit por cada capa. Pasa uno a un raycast después de maxDistance, y el rayo ignora todos los colliders de las capas que no pertenezcan al conjunto.

Este jugador debería saltar desde el suelo, no desde la cabeza de los enemigos. Los suelos van en una capa Ground, y el script obtiene un campo LayerMask, que el Inspector muestra como un menú donde marcas Ground:

[SerializeField] private LayerMask groundMask;

bool IsGrounded()
{
    return Physics.Raycast(transform.position, Vector3.down, 1.1f, groundMask);
}

Una máscara que solo incluya Ground también evita que la comprobación encuentre al jugador. Un rayo omite el collider en cuyo interior comienza, pero no los otros colliders del jugador, como el de un hijo; además, las pruebas de solapamiento de una lección posterior sí encuentran el collider del propio jugador, así que una comprobación en los pies sin máscara siempre diría que está en el suelo. Pon al jugador y a sus hijos en una capa Player y deja Player fuera de las máscaras que usan sus comprobaciones. En el código, LayerMask.GetMask("Ground", "Platform") crea una máscara a partir de nombres de capas, y ~ delante de una máscara la invierte para incluir todas las capas que no contenía.

challenge icon

Desafío

Intermedio

El explorador debería informar de lo que tiene delante, pero LookAhead() siempre devuelve Lantern. Su rayo pasa por alto el cuerpo del Scout, dentro del cual empieza, y después choca con la linterna que el Scout sostiene delante. El Scout y su Lantern están en la capa Player. Corrige LookAhead() en Spotter:

  • Construye en el código una máscara de todas las capas excepto Player, con LayerMask.GetMask.
  • Pásala al raycast, que mantiene su range, para que el rayo atraviese la linterna e informe de lo primero que haya más allá.

Pulsa Play y gira al explorador con las flechas: la Console registra lo que ve. Después, pulsa Check.

Pruébalo tú mismo

using UnityEngine;

public class Spotter : MonoBehaviour
{
    public float range = 10f;
    private string last = "";

    void Update()
    {
        string seen = LookAhead();
        if (seen != last)
        {
            Debug.Log("Ahead: " + seen);
            last = seen;
        }
    }

    // El nombre de lo primero que hay delante dentro del alcance, o "nothing".
    public string LookAhead()
    {
        if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, range))
        {
            return hit.collider.name;
        }
        return "nothing";
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Física y jugabilidad