Menu
CoddyTech

Layer e LayerMask

Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 38 di 71.

Ogni GameObject si trova su un solo layer, selezionato nel menu Layer in cima all'Inspector. Unity ne ha 32: alcuni sono integrati (0 Default, 2 Ignore Raycast, 4 Water, 5 UI), e puoi assegnare un nome ai tuoi in Tags and Layers, a partire da User Layer 3. Una LayerMask è un insieme di layer, un bit per ogni layer. Passane una a un raycast dopo maxDistance e il raggio ignorerà ogni collider su un layer che non fa parte dell'insieme.

Questo giocatore dovrebbe saltare da terra, non dalle teste dei nemici. I pavimenti vanno su un layer Ground e lo script riceve un campo LayerMask, che l'Inspector mostra come un menu in cui spuntare Ground:

[SerializeField] private LayerMask groundMask;

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

Una maschera che include solo Ground impedisce anche al controllo di rilevare il giocatore. Un raggio ignora il collider al cui interno inizia, ma non gli altri collider del giocatore, ad esempio quelli di un figlio; inoltre, i test di sovrapposizione di una lezione successiva rilevano il collider del giocatore stesso, quindi un controllo ai piedi senza maschera restituirebbe sempre grounded. Metti il giocatore e i suoi figli su un layer Player e lascia Player fuori dalle maschere usate dai suoi controlli. Nel codice, LayerMask.GetMask("Ground", "Platform") crea una maschera a partire dai nomi dei layer, mentre ~ davanti a una maschera la inverte, includendo tutti i layer che non conteneva.

challenge icon

Sfida

Medio

Fai in modo che il raggio dell'esploratore guardi oltre la sua lanterna.

  1. In LookAhead(), crea int mask = ~LayerMask.GetMask("Player");: ogni livello tranne Player, dove si trovano lo Scout e la sua Lantern.
  2. Passa mask al raycast, dopo range.

Premi «Gioca» e gira l'esploratore con le frecce: la Console mostra i nomi Rock e Tree. Poi premi «Verifica».

Provalo tu

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;
        }
    }

    // Il nome del primo oggetto davanti entro range, oppure "nothing".
    public string LookAhead()
    {
        if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, range))
        {
            return hit.collider.name;
        }
        return "nothing";
    }
}

Tutte le lezioni di Fisica e gameplay

Esercitati da solo: Playground Unity