Overlap.box - RAYCAST

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
XeXo
Messages : 6
Inscription : 31 Août 2020 08:38

Overlap.box - RAYCAST

Message par XeXo » 05 Sep 2020 10:59

Bonjour a toutes et a tous,

Je me suis inscrit recement sur se site que je parcours beaucoup ces derniers temps ^^.

Petite presentation :
Je me suis lancer dans un projet ; que je vous detaillerez plus bas ; avec un ami sur UNITY.
J'ai de vague notion de programmation, j'ai fait plein de tuto mais j'ai toujours buter sur la documentation des languages, ou arreter a la programmation POO.

Mon projet :
Je veux realiser un jeux 2D , vu de profil, ressemblant quelque peux a mine craft, le personnage est bloquer autour de lui par du decor.
Le decor se genere selon sont deplacement , le but etant que le personnage ne vois jamais la generation de terrain , car il se situe en dehors de son champ de vision,

J'ai donc travailler ses deux aspects et au fil de mes recherche je suis arriver a un resultat, mais je ne suis pas 100% sur du code que j'execute ....^^
je travaille avec des image realise par mes soin en 50px par 50px . un sprite de cette taille prend donc tout la place de la case dans unity et se situe a des point cardinaux ENTIER.

Destruction decor = j'ai utiliser un raycast pour detecter l'objet le plus proche selon la position du joueur :


Code : Tout sélectionner

if (attaqueGa) // 
        {
            araGa = PosXY - araGa; //  PosXY = position en INT du sprite , araGa = V2(5,0.5f)

            PosXY = PosXY + PosXYJZ;  // POS. joueur - POSXYJZ = (-1.1f, 0.5f)
            RaycastHit2D abracadabra = Physics2D.Raycast(PosXY, araGa, 0.5f); // je cast 
            abracadabra.transform.gameObject.GetComponent<Renderer>().enabled = false;

            yolo = abracadabra.transform.gameObject.GetComponent<Collider2D>();
            yolo.isTrigger = true;
            Debug.Log("saluGAUCHE" + abracadabra.collider.transform.position);
        }
premier probleme avec ce code , je ne vois pas exactement ou ce cast le raycast , ci certain pouvait m'eclairer dessus... autre probleme , j'ai voulu au depart creer une fonction et lui passer en parametre ce dont elle a besoin pour fonctionner, la encore grossse lacune ...^^
Mon raycast doit partir en dehors du boxcollider de mon personnage , se situer a peu pres a la moitie de celui ci et aller tres peu en avant .... ai'je reussi??
IG se code marche bien.



Viens ensuite la generation de terrain , une pour la droite , gauche et en bas , j'ai utiliser overlap.box car le raycast me poser trop de probleme ... :

Code : Tout sélectionner

Seek = new Vector2(3f, 3f);
prout = new Vector2(0, 1);
PosXY = new Vector2(IposXD, y); //  PosXY V2 en INT , les float m'on poser trop de probleme dans la generation 
y = y + 3;   // position Y du joueur +3
IposXD = IposXD + 3;     // la position du joueurs a chaque frame arrondi en entier + 3

if (Mdroite) // si j'appuie sur "right" key
        {


            for (int w = 0; w < 4; w++)
            {

                yolo = Physics2D.OverlapBox(Seek, Sook, 0); // JE CREER MA BOXOVERLAP 
                Debug.Log("seek" + Seek);
                Debug.Log(yolo == null);
                //IposX = IposX + 3;
                //y = y + 3;

                if (yolo == null)
                {
                    Instantiate(sol, new Vector2(IposXD, y), Quaternion.identity);
                    Seek = Seek - prout;
                    y = y - 1;

                    Debug.Log("j =" + y);
                    Destroy(yolo); // JE DETRUIS YOLO !!!

                }
            }

        }
Le probleme avec ce code, probleme que j'ai vu se matin , j'ai un probleme avec les Y lors de la generation quand il passe en inferieur,
Un autre probleme et que je ne vois pas, encore, ou se situe reelement mon Overlap.box , je voulais la creer en plein millieu d'un decor , creer une petite box au centre de mes sprite 50px par 50px , qui se deplace et qui genere. j'ai plus l'impression qu'elle commence en bas a gauche qu'au centre ... merci de m'eclairer ^^.
et alors pour creer une fonction la aussi enooorme probleme , j'ai 3-4 Vector2 a passer en parametre et d'autre variable.

IG le code ne marche pas totalement comme je l'espere (y negatif probleme)


Je voulais aussi avoir des renseignement sur ce qu'est une CLASS , je me rappel avoir entendu ce mot dans d'autre tutoriel mais je ne voyais pas l'importance, et la on dirait que c'est un truc totalement gerer par untity.

Je vous remercie pour la lecture de ce post ..
Je tiens a m'excuser si celui ci reste lourd a lire , j'essaierai de m'ameliorer par la suite
Je tiens a remercier particulierement la communauté et ceux qui entretiennent le forum .

XeXo.

XeXo
Messages : 6
Inscription : 31 Août 2020 08:38

Re: Overlap.box - RAYCAST

Message par XeXo » 05 Sep 2020 13:32

j'ai esseyer de creer une fonction pour la generation de map a droite quand le personnage se deplace:

Code : Tout sélectionner

void Cr_3T(Collider2D a,  Vector2 b, Vector2 c)
        {
            for (int w = 0; w < 4; w++)
            {
                a = Physics2D.OverlapBox(b, c, 0);
                if (a == null)
                {
                    Instantiate(sol, new Vector2(b.x, b.y), Quaternion.identity);
                b.y = b.y - 1;
                Destroy(yolo); // JE DETRUIS YOLO !!!

                }
                else if (yolo == true)
                {
                b.y = b.y - 1;
                }
            }


        }   
ce code si ne marche pas, pourtant il est tirer de celui ci :

Code : Tout sélectionner

for (int w = 0; w < 4; w++)
               {

              yolo = Physics2D.OverlapBox(Seek, Sook, 0); // JE CREER MA BOXOVERLAP 
              Debug.Log("seek" + Seek);
              Debug.Log(yolo == null);
           
             

               if (yolo == null)
              {
              Instantiate(sol, new Vector2(Seek.x, Seek.y), Quaternion.identity);
            
              Seek.y = Seek.y - 1;

              Debug.Log("j =" + y);
              Destroy(yolo); // JE DETRUIS YOLO !!!

             }

             else if (yolo == true)
              { 
               Seek.y = Seek.y - 1;
              }


             }
Et celui ci marche tres bien .. si quelqu'un a la reponse, je dois surement faire quelque chose de mal dans la declaration de ma fonction?
 ! Message de : Max
Utilisez les balises code SVP
Merci de lire la Charte et sa FAQ, en particulier Comment insérer un script dans un messages ?.

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

Re: Overlap.box - RAYCAST

Message par Max » 05 Sep 2020 14:10

Salut,

on va y aller par étape.

Premier script, premier message. Tu fais un RayCast, mais si ton RayCast ne tombe sur rien, ton objet RaycastHit2D abracadabra sera Null, et donc la ligne de code qui suit te donnera un beau NullReference (erreur dans la console).
Il faut toujours tester si ton Cast donne un résultat.
En suite, si abracadabra est non null, pourquoi passer le Renderer à false ? Pourquoi ne simplement pas désactiver le GameObject (avec SetActive) ?
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

XeXo
Messages : 6
Inscription : 31 Août 2020 08:38

Re: Overlap.box - RAYCAST

Message par XeXo » 05 Sep 2020 14:41

je ne connais pas cette fonction,

Et je suis partis la dessus car je pensais qu'il fallait que je desactive certain composant de l'objet pour pouvoir garder mon collider2D et ne pas generer de la map une seconde fois par dessus.

Merci pour l'info sur les raycast. Je me demandais d'ou pouvais venir ces message d'erreur.

lorsque je lance le jeu mon personnage est au coordonée 0.00003x et 0.8392 y et je ne comprend pas vraiment d'ou par le raycast et ou il s'arrete malgré que sa marche..

PS= merci pour l'info sur les quote

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

Re: Overlap.box - RAYCAST

Message par Max » 05 Sep 2020 15:45

XeXo a écrit :
05 Sep 2020 14:41
je ne connais pas cette fonction,

Et je suis partis la dessus car je pensais qu'il fallait que je desactive certain composant de l'objet pour pouvoir garder mon collider2D et ne pas generer de la map une seconde fois par dessus.
si ton niveau est constitué de sprites définis, se situant à des points de références (une grille finalement, c'est le principe des tilemap, à moins que je n'ai pas compris ton approche), tu as des artifices de mémorisation possible (comme un tableau d'entiers en deux dimensions par exemple).
XeXo a écrit :
05 Sep 2020 14:41
lorsque je lance le jeu mon personnage est au coordonée 0.00003x et 0.8392 y et je ne comprend pas vraiment d'ou par le raycast et ou il s'arrete malgré que sa marche..
La doc est là pour t'éclairer. Dans le cas du Raycast2D, les paramètres que tu fournis sont la position de départ du rayon (celle du player je suppose), la direction que le rayon doit prendre pour faire le test (souvent la direction vers laquelle le player se déplace), et éventuellement en option des éléments comme une distance fixe (la porté du rayon en quelque sorte) ou encore un layermask, destiné à "filtrer" le type d'élément à tester.

Ce que tu cherches à faire n'est pas si simple qu'il y parait. Là on a un peut l'impression que tu y va à taton. Bien appréhender les fonctions de base est important, quitte à passer par un level de test pour se faire la main pour certaines d'entre elles (un ou deux sprites, un script de test, utiliser les fonctions Gizmo pour du visuel, etc...) ;)
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

XeXo
Messages : 6
Inscription : 31 Août 2020 08:38

Re: Overlap.box - RAYCAST

Message par XeXo » 05 Sep 2020 17:28

Merci pour tes reponses,

Le probleme avec le raycast , c'est que je n'est aucun moyen de savoir sa position?? les seul tuto que j'ai vu utilise la fonction Debug.drawray, mais jn'est pas compris comment on l'utilise ^^.
Du coup non je ne le fait pas partir du joueur car le raycast recuperé son box collider2D , donc je le fait partir apres , enfin du moins j'essaie , et d'etre le plus centrer possible .

Je ne pense pas non plus avoir d'approche precise , c'est pour sa que je viens deposer ce code ici , je trouve etre aller quand meme assez loin et je me demandais si je faisait fause route.
Je vais aller voir du coté des tilesmap pour gerer cette grille, j'ai vu quelque tuto dessus mais sa ne m'a pas parus evident lorsque j'ai commencer a faire le projet.

https://docs.unity3d.com/ScriptReferenc ... wCube.html

Gizmos are used to give visual debugging or setup aids in the Scene view.

"All gizmo drawing has to be done in either OnDrawGizmos or OnDrawGizmosSelected functions of the script.
OnDrawGizmos is called every frame. All gizmos rendered within OnDrawGizmos are pickable. OnDrawGizmosSelected is called only if the object the script is attached to is selected".

J'ai du mal a comprendre "aids" dans ce texte ? et du coup l'utilité de cette fonction , elle dessine des formes pour selectionner ce qu'il y a a l'interieur ou juste pour pouvoir recuperer les coordonnée du cube et y generer de la map ??

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

Re: Overlap.box - RAYCAST

Message par Max » 06 Sep 2020 11:41

Hello,

Dans ton cas, ton RayCast part de ton Player je suppose. Donc sa position serait le transform.position de celui-ci. En suite, la direction est certainement liée à l'orientation du Player. Si il va vers la droite, on peut indiquer comme direction Vector2.right. Au niveau du positionnement du RayCast, tu as deux options qui s'offrent à toi. La première est de générer la Cast légèrement devant ton player, pour qu'il n'y ai pas d'interférence avec le collider de celui-ci. Autre solution, à privilégier la plupart du temps, est de filtrer le RayCast grâce aux layerMasks. Par exemple, ton décor aura un layer 8 (nommé par exemple Ground), et la RayCast ne détectera alors que les éléments du décor.

Après pour visualiser ce que fait ton Raycast, tu peux faire appel à une des fonctions Gizmo.
Le principe des Gizmo est de fournir des fonctions facilitant le debug grâce à des artifices visuels. Voir la doc pour en savoir plus, en particulier la partie API qui liste les possibilités d'utilisation.

Pour imager la chose de manière basique et très simple, cela ressemblerais à:

Code : Tout sélectionner

    void FixedUpdate()
    {
        // Cast a ray straight down.
        RaycastHit2D hit = Physics2D.Raycast(transform.position, Vector2.right);
        
        if(hit.collider != null)
        {
            // ton code
        }
    }

    void OnDrawGizmos()
    {
        Gizmos.color = Color.yellow;
        Gizmos.DrawRay(transform.position, Vector2.right);
    }
symbolisé dans ta scène genre (la ligne jaune étant donc la représentation visuelle du RayCast):
Image

Tout cela, ce sont les bases. Je ne peux que réitérer mon conseil sur le fait de suivre une formation minimum au travers des tuto d'Unity, dans ton cas plus spécifiquement tout ce qui touche à la 2D. C'est ludique, et une fois passé ce cap, créer ton jeu sera un plaisir, pas un chemin de croix ;)
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

XeXo
Messages : 6
Inscription : 31 Août 2020 08:38

Re: Overlap.box - RAYCAST

Message par XeXo » 07 Sep 2020 18:06

je te remercie encore pour tout ces conseils,

Ai-je parler a un moment de chemin de croix?? c'est un reel plaisir et je le vis comme sa , sinon je n'ecrirai même pas une ligne de code ^^.
Je suis aller voir du coté de la tiles map , et j'ai reussi a apprivoiser le raycast ( plus ou moins ^^) , je vais esseyer de travailler sur la tilemap et voir ce que je peux faire avec.
Merci encore pour les conseils, et ta contribution general au forum .

XeXo

Avatar de l’utilisateur
jmhoubre
Messages : 856
Inscription : 05 Oct 2019 22:05

Re: Overlap.box - RAYCAST

Message par jmhoubre » 07 Sep 2020 23:26

Bonsoir, pour la 2D, il y a quelques tutos en français, ou plutôt série de tuto :

Tuto Unity Fr finit une série sur la 2D, c'est plutôt à jour : Créer un jeu en 2D facilement avec Unity. La série n'est pas finie, mais touche à sa fin (31 épiodes quand même). L'auteur est plutôt pédago, et la série est bien préparée.

Unity pour les Nuls a également une série de 2016 Unity Créer un jeu 2D facilement. C'est moins récent, mais c'est fini et semble-t-il plus court. Peut-être commencer par celle-ci. L'auteur est plus brouillon. Je ne suis pas sûr qu'il prépare beaucoup ses vidéos.

Répondre

Revenir vers « Scripting »