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.
Défi
MoyenFais en sorte que le rayon de l’éclaireur regarde au-delà de sa propre lanterne.
- Dans
LookAhead(), créeint mask = ~LayerMask.GetMask("Player");: tous les calques sauf Player, où se trouvent l’éclaireur et sa lanterne. - Passe
maskau lancer de rayon, aprèsrange.
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
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 à rebours7Rotation
Angles d’EulerQuaternionsRegardez dans la direction où vous vous déplacezTourner en douceurRécapitulatif : tourelle10Projet : Évasion de l’arène
L’arèneLes chasseurs2Collisions
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 à ramasser3Déclencheurs
Colliders déclencheursOnTriggerEnterObjets à ramasserLes caisses gardent le resteZones mortellesEntrée et sortieRécapitulatif : clé et porte6Lancers de rayons
Physics.RaycastRaycastHitVérifier le sol avec un rayonLayers et LayerMaskLigne de vueOverlapSphere et SphereCastRécapitulatif : fil-piège laserEntraînez-vous par vous-même : Playground Unity