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.
Défi
MoyenL’é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";
}
}
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
1Corps rigide
Gravité et massePousser avec AddForceSauter avec une impulsionFixedUpdate pour la physiqueVitesseCorps cinématiquesRécapitulatif : plateforme de lancement4Coroutines
InvoquerInvokeRepeating, CancelInvokeVotre première coroutineBoucles dans les coroutinesArrêter les coroutinesRécapitulatif : compte à rebours2Collisions
OnCollisionEnterQu’est-ce que j’ai touché ?Se briser à l’impactRester au solRebond et frictionFormes des collidersRécapitulatif : mur destructible5Projet : Course aux pièces
La balle roulanteDes pièces à ramasser