Menu
CoddyTech

Capas y LayerMask

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

Cada GameObject está en una capa, elegida 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. Una LayerMask es un conjunto de capas, con un bit por capa. Pasa una a un raycast después de maxDistance, y el rayo ignora todos los colisionadores de las capas que no están en el 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 incluye Ground también evita que la comprobación detecte al jugador. Un rayo omite el colisionador en cuyo interior empieza, pero no los otros colisionadores del jugador, como el de un objeto hijo, y las pruebas de solapamiento de una lección posterior sí detectan el propio colisionador del 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 objetos hijos en una capa Player y deja Player fuera de las máscaras que usan sus comprobaciones. En 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

Haz que el rayo del explorador mire más allá de su propia linterna.

  1. En LookAhead(), crea int mask = ~LayerMask.GetMask("Player");: todas las capas excepto Player, donde están el explorador y su linterna.
  2. Pasa mask al raycast, después de range.

Pulsa «Jugar» y gira el explorador con las flechas: la consola indica los nombres de la roca y del árbol. Después, pulsa «Comprobar».

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 del primer objeto que haya 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";
    }
}

Todas las lecciones de Física y jugabilidad

Practica por tu cuenta: Playground de Unity