[RESOLU][DB]Problème LayerMask Physic.Raycast

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
zebilamouche
Messages : 38
Inscription : 17 Juin 2016 20:34

[RESOLU][DB]Problème LayerMask Physic.Raycast

Message par zebilamouche » 14 Mars 2017 05:00

Salut à tous,

j'ai un problème lorsque j'attribue un LayerMask sur la fonction Physic.Raycast().
Je souhaite tracer un RayCast de la position de mon curseur à mon terrain sans toucher d'autres colliders, c'est pourquoi j'utilise le LayerMask. Voici le code :

Code : Tout sélectionner

 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        if (Physics.Raycast(ray, out hit,Mathf.Infinity,2))
        {
            Vector3 pos = new Vector3(hit.point.x, hit.point.y + 2.0f, hit.point.z);
            transform.position = pos;
        }
Le Layer du terrain est bien '8', j'ai même vérifié de cette manière pour être sûr :

Code : Tout sélectionner

Debug.log(terrainGameObject.layer)
C'est la première fois que ce problème m'arrive, mais d'habitude à la place d'un Ray en première variable du RayCast() j'utilise un Vector3. L'utilisation du Ray pose peut-être un problème ?

En tout cas lorsque je n'utilise pas de layerMask le rayCast fonctionne correctement.

En vous remerciant.
Dernière édition par zebilamouche le 14 Mars 2017 13:59, édité 1 fois.

Avatar de l’utilisateur
Max
Messages : 8771
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB]Problème LayerMask Physic.Raycast

Message par Max » 14 Mars 2017 09:44

Bonjour,
Ton objet terrain semble avoir le layer 8 si j'ai bien compris. Pourquoi écrire Physics.Raycast(ray, out hit,Mathf.Infinity, 2) ?

Une des solutions serait d'écrire:

Code : Tout sélectionner

...
		int mask = 1 << 8;  // ou encore int mask = 1 << tonGameObject.layer;
		if (Physics.Raycast(ray, out hit,Mathf.Infinity, mask))
...
Lien, pour avoir peut-être une meilleurs vision concernant l'emploi des mask.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Avatar de l’utilisateur
evereal
Messages : 109
Inscription : 06 Nov 2015 18:46

Re: [DB]Problème LayerMask Physic.Raycast

Message par evereal » 14 Mars 2017 10:18

Salut,
Pas mieux que Max pour la solution.
Il faut savoir qu'un LayerMask, même si celui ci est représenté par un int, a une signification particulière.
C'est dans son format binaire qu'il sera interprété. les 1 représentent les mask que l'on utilise, les 0 ceux qu'on ignorent.
Pour un layermask ignorant tout sauf le 8ème layer, on aura donc en binaire le nombre 100000000 égale 256 en décimal.
Ton nombre 2 (10 en binaire) ignore donc tout sauf le second layer.
La notation utilisée par Max pour définir son mask est la plus commune :
int mask = 1 << 8; nous dit grosso modo : crée moi un entier et met un 1 à la 9ème position de son format binaire.

Lien vers la doc d'unity sur les layers : https://docs.unity3d.com/Manual/Layers.html
Dernière édition par evereal le 14 Mars 2017 15:56, édité 1 fois.
“La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !”

zebilamouche
Messages : 38
Inscription : 17 Juin 2016 20:34

Re: [DB]Problème LayerMask Physic.Raycast

Message par zebilamouche » 14 Mars 2017 13:59

Problème réglé, merci pour ces informations qui me seront très utiles par la suite :)

Avatar de l’utilisateur
ZJP
Messages : 5748
Inscription : 15 Déc 2009 06:00

Re: [RESOLU][DB]Problème LayerMask Physic.Raycast

Message par ZJP » 14 Mars 2017 15:30

Tiens, cela me rappelle quelque chose.... :mrgreen:
Ma petite contribution à propos des layers. Un complément des infos données par Max.

Code : Tout sélectionner

Numero du Layer          Valeur Binaire du Layer

Builtin Layer 0           1
Builtin Layer 1           2
Builtin Layer 2           4
Builtin Layer 3           8
Builtin Layer 4          16
Builtin Layer 5          32
Builtin Layer 6          64
Builtin Layer 7         128
User Layer    8         256
User Layer    9         512
User Layer   10        1024
User Layer   11        2048
User Layer   12        4096
User Layer   13        8192
User Layer   14       16384
User Layer   15       32768
User Layer   16       65536
User Layer   17      131072
User Layer   18      262144
User Layer   19      524288
User Layer   20     1048576
User Layer   21     2097152
User Layer   22     4194304
User Layer   23     8388608
User Layer   24    16777216
User Layer   25    33554432 
User Layer   26    67108864
User Layer   27   134217728
User Layer   28   268435456
User Layer   29   536870912
User Layer   30  1073741825
User Layer   31  2147483650
Donc un LayerMask combinant le Layer 2 et le Layer 12 serait égal à 4 + 4096 >>> 4100

Répondre

Revenir vers « (C#) CSharp »