Menu
CoddyTech

Layers et LayerMask

Fait partie de la section Physique et gameplay du Journey Unity de Coddy. Leçon 36 sur 63.

Chaque GameObject se trouve sur un seul calque, sélectionné dans le menu Layer en haut de l’Inspector. Unity en possède 32 : quelques-uns sont intégrés (0 Default, 2 Ignore Raycast, 4 Water, 5 UI), et tu peux nommer les tiens dans Tags and Layers, à partir de User Layer 3. Un LayerMask est un ensemble de calques, avec un bit par calque. Passe-en un au raycast après maxDistance, et le rayon ignore tous les colliders sur un calque qui ne fait pas partie de l’ensemble.

Ce joueur devrait sauter depuis le sol, et non depuis la tête des ennemis. Place les sols sur un calque Ground, et ajoute au script un champ LayerMask, que l’Inspector affiche sous forme de menu dans lequel tu coches Ground :

[SerializeField] private LayerMask groundMask;

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

Un masque limité à Ground empêche aussi la détection du joueur. Un rayon ignore le collider dans lequel il commence, mais pas les autres colliders du joueur, comme celui d’un enfant, et les tests de chevauchement d’une leçon ultérieure détectent bien le collider du joueur lui-même ; un test au niveau des pieds sans masque indiquerait donc toujours que le joueur est au sol. Place le joueur et ses enfants sur un calque Player et exclue Player des masques utilisés par ses vérifications. En code, LayerMask.GetMask("Ground", "Platform") crée un masque à partir des noms de calques, et ~ devant un masque le transforme en masque couvrant tous les calques qu’il ne contenait pas.

challenge icon

Défi

Moyen

L’éclaireur doit signaler ce qui se trouve devant lui, mais LookAhead() renvoie toujours Lantern. Son rayon ignore le corps de l’éclaireur, qu’il traverse au départ, puis rencontre la lanterne que l’éclaireur tient devant lui. L’éclaireur et sa lanterne sont sur la couche Player. Corrige LookAhead() dans Spotter :

  • Construis un masque comprenant toutes les couches sauf Player dans le code, avec LayerMask.GetMask.
  • Transmets-le au lancer de rayon, qui conserve sa range, afin que le rayon traverse la lanterne et signale le premier élément au-delà.

Appuie sur Play et tourne l’éclaireur avec les flèches : la Console affiche ce qu’il voit. Puis appuie sur Check.

Essayez vous-même

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

    // Le nom du premier élément situé devant, à portée, ou "nothing".
    public string LookAhead()
    {
        if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, range))
        {
            return hit.collider.name;
        }
        return "nothing";
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Physique et gameplay