Menu
CoddyTech

Layers et LayerMask

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

Chaque GameObject se trouve sur un seul calque, choisi dans le menu Layer en haut de l’Inspector. Unity en propose 32 : quelques-uns sont intégrés (0 Default, 2 Ignore Raycast, 4 Water, 5 UI), et tu nommes 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 à un raycast après maxDistance, et le rayon ignore tous les colliders des calques qui ne font 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 le script reçoit 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 contenant uniquement 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. Ainsi, une vérification au niveau des pieds sans masque indiquerait 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 des calques, et ~ placé devant un masque le transforme en masque contenant tous les calques qu’il ne contenait pas.

challenge icon

Défi

Moyen

Fais en sorte que le rayon de l’éclaireur regarde au-delà de sa propre lanterne.

  1. Dans LookAhead(), crée int mask = ~LayerMask.GetMask("Player"); : tous les calques sauf Player, où se trouvent l’éclaireur et sa lanterne.
  2. Passe mask au lancer de rayon, après range.

Appuie sur « Jouer » et tourne l’éclaireur avec les flèches : la Console indique les noms Rock et Tree. Puis appuie sur « Vérifier ».

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 objet devant soi à portée, ou "nothing".
    public string LookAhead()
    {
        if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, range))
        {
            return hit.collider.name;
        }
        return "nothing";
    }
}

Toutes les leçons de Physique et gameplay

Entraînez-vous par vous-même : Playground Unity