Menu
CoddyTech

Layer e LayerMask

Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 36 di 63.

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

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

[SerializeField] private LayerMask groundMask;

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

Anche una maschera che include solo Ground impedisce al controllo di rilevare il player. Un raggio ignora il collider al cui interno inizia, ma non gli altri collider del player, come quelli di un elemento figlio; inoltre, i test di sovrapposizione di una lezione successiva rilevano il collider del player stesso, quindi un controllo ai piedi senza maschera direbbe sempre che è a terra. Imposta il player e i suoi elementi figli sul layer Player e lascia Player fuori dalle maschere usate dai suoi controlli. Nel codice, LayerMask.GetMask("Ground", "Platform") crea una maschera dai nomi dei layer e ~ davanti a una maschera la inverte, includendo tutti i layer che non conteneva.

challenge icon

Sfida

Medio

Lo scout dovrebbe segnalare cosa si trova davanti, ma LookAhead() restituisce sempre Lantern. Il suo raggio ignora il corpo dello Scout, al cui interno parte, poi colpisce la lanterna che lo Scout tiene davanti a sé. Lo Scout e la sua Lantern si trovano sul layer Player. Correggi LookAhead() in Spotter:

  • Nel codice, crea una maschera che includa tutti i layer tranne Player, con LayerMask.GetMask.
  • Passala al raycast, mantenendo il suo range, così il raggio oltrepassa la lanterna e segnala il primo oggetto che si trova oltre.

Premi Play e gira lo scout con le frecce: la Console registra ciò che vede. Poi premi Check.

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 della prima cosa davanti entro la distanza range, oppure "nothing".
    public string LookAhead()
    {
        if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, range))
        {
            return hit.collider.name;
        }
        return "nothing";
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Fisica e gameplay