RESOLU [DB-AL] fermer un menu au clic en dehors

Questions à propos du GUI, y compris la partie script.
Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6216
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB-AL] fermer un menu au clic en dehors

Message par boubouk50 » 02 Juin 2017 11:15

Franchement, t'embêtes pas. Tu reprends l'exemple de la doc avec un Update () pour tester et si la souris a cliqué un élément d'UI pour masquer tes menus et c'est terminé.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

lauraneb
Messages : 30
Inscription : 01 Juin 2017 14:14

Re: [DB-AL] fermer un menu au clic en dehors

Message par lauraneb » 02 Juin 2017 11:47

c'est ce que j'ai fait, vu que j'ai pas le niveau pour coder ...
mais j'ai un autre probleme depuis que j'ai créé un script spécifique pour la gestion de la souris et du menu ... visual n'accepte pas certains events comme defini dans la doc d'unity et il me bloque tout... ou alors j'ai pas compris ce qui bloque ;)
il me demande de creer une fonction cursormodelock puis de l'appeler. mais quand je le fais il me demande de creer une fonction sur l'appel... un bidule sans fin gggrrrhhhh :)

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6216
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB-AL] fermer un menu au clic en dehors

Message par boubouk50 » 02 Juin 2017 12:14

Si tu as des questions sur la programmation en général ou des petits trucs qui te font pousser des échardes dans les yeux, tu peux aller demander de l'aide en direct sur le discord Unity-France.
https://discord.gg/XnW4ff (Lien valide un jour)
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

lauraneb
Messages : 30
Inscription : 01 Juin 2017 14:14

RESOLU Re: [DB-AL] fermer un menu au clic en dehors

Message par lauraneb » 02 Juin 2017 14:19

je prefere comprendre et trouver des solutions que la discorde :) en tout cas merci a vous pour l'aide apporté. Je dirais que la solution a été trouvé au probleme qui se posait ... pour le reste je vais essayer de me dépatouiller... et si vraiment je n'y arrive pas je poserai la question :)

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6216
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: RESOLU Re: [DB-AL] fermer un menu au clic en dehors

Message par boubouk50 » 02 Juin 2017 16:42

lauraneb a écrit :je prefere comprendre et trouver des solutions que la discorde :)
Magnifique jeu de mots :) .
Le chan discord te permettra de discuter avec des devs/graphistes/autres qui peuvent t'apprendre plein de choses et t'aider à comprendre, disons que c'est plus rapide que le forum surtout pour ce qui n'est pas lié directement à Unity
lauraneb a écrit :en tout cas merci a vous pour l'aide apporté.
Avec plaisir, on est là pour ça. ;-)
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
Greg
Messages : 156
Inscription : 08 Mai 2017 15:22

Re: RESOLU [DB-AL] fermer un menu au clic en dehors

Message par Greg » 05 Juin 2017 08:43

Bonjour,
j'ai un peu le même problème de déformation professionnel et d'approche 'naturelle' différente. Au bout d'un loooooong moment, on commence à parvenir à 'réfléchir' à l'envers! ^^

Je te conseille dans un premier temps de ne pas absolument vouloir tout sortir de l'Update.
Déjà, parce qu'au début le plus important est de comprendre, d'avancer et que ça marche. Les idées et compétences d'optimisation viendront au fur et à mesure et se feront ressentir si nécessaire.
Ensuite, parce qu'à chaque frame, Unity parse un paquet de trucs.
Les Updates, les Events, les Inputs mais aussi les nouveaux Starts, les Coroutines, les Rendering....

Je ne dis pas qu'il faut coder comme un cochon mais vérifier un booléen dans un Update ne sera jamais aussi gourmand qu'un mesh avec trop de polygones par exemple. Dans l'optimisation de la gourmandise, l'optimisation des algorithmes est loin d'être en première place et Unity s'en charge pas trop mal à la compilation de l'application (notamment par le système de start, update, fixedupdate et lateupdate).
Il faut enfin garder à l'esprit que lors du rendu d'une application, à chaque frame, le processeur doit calculer tout ce qu'il faut à l'OS (windows, android...), souvent internet, tout ce qu'il faut au matériel (téléphone, carte mère etc), souvent une console logiciel dans laquelle tourne l'application (java, unity...) et enfin gérer ton jeu en plus.
Il faut voir l'utilisation CPU comme un rapport puissance/consommation et vu les graphismes qui tourne actuellement sur les différentes platformes, il faut vraiment être gourmand pour saturer la plupart des systèmes. A part si ton jeu comporte des "légions" d'avatars, que tu tournes ou bien te destines à publier sous windows xp, tu devrais avoir un peu de marge.

:merci:
Mon jeu de développement cellulaire : MICROBIOME (encore quelques bugs...)
(merci bien à ceux qui passent mettre des étoiles ! ^^)

Avatar de l’utilisateur
Greg
Messages : 156
Inscription : 08 Mai 2017 15:22

Re: RESOLU [DB-AL] fermer un menu au clic en dehors

Message par Greg » 05 Juin 2017 09:22

Sinon pour répondre à ta question, j'avais grosso modo suivie tout ton cheminement et galéré une bonne quinzaine de jours avec le même problème. Je m'en suis sorti en faisant un petit truc barbare...

En premier lieu mettre un component 'Graphic Raycaster' sur les panels ou boutons devant être 'détecter'.
Ensuite, mettre ceci dans un script :

Code : Tout sélectionner

    
    void Update()
    {
        IsPointerOverUILayer();
     }
     
     IsPointerOverUILayer()
    {
        PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current);
        eventDataCurrentPosition.position = Input.mousePosition;
        List<RaycastResult> results = new List<RaycastResult>();
        EventSystem.current.RaycastAll(eventDataCurrentPosition, results);

        if (results.Count == 0)
            return;

        foreach (RaycastResult rr in results)
        {
            print(rr.sortingLayer); // ==  Component Graphic Raycaster Layer
        }
    }
Faire tourner le jeu et passer la souris sur un Graphic Raycaster afin de voir son layer s'afficher dans la console.
Dans mon cas : "-398733847"

Supprimer le bout de code précédent et le remplacer par :

Code : Tout sélectionner

    public bool IsPointerOverUiGraphicRaycaster()
    {
        bool onUiObject = false;
        PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current);
        eventDataCurrentPosition.position = Input.mousePosition;
        List<RaycastResult> results = new List<RaycastResult>();
        EventSystem.current.RaycastAll(eventDataCurrentPosition, results);

        if (results.Count == 0)
            return onUiObject;

        foreach (RaycastResult rr in results)
        {
            if (rr.sortingLayer == -398733847)
                onUiObject = true;
        }

        return onUiObject;
    }
Enfin, il ne restera plus qu'a tester au clique :

Code : Tout sélectionner

	if (monScript.IsPointerOverUiGraphicRaycaster())
            // do one thing.
	else
	    // do another thing.
Mon jeu de développement cellulaire : MICROBIOME (encore quelques bugs...)
(merci bien à ceux qui passent mettre des étoiles ! ^^)

lauraneb
Messages : 30
Inscription : 01 Juin 2017 14:14

Re: RESOLU [DB-AL] fermer un menu au clic en dehors

Message par lauraneb » 05 Juin 2017 10:46

merci Greg pour ta solution et tes conseils j'en prends bonne note car il est vrai que je cherche à avoir les bonnes pratiques des le depart avec unity ; celle de Boubouk50 fonctionne. en plus grace a lui j'ai découvert que je me prends la tete sur le code depuis un mois alors que je pouvais faire tout ça depuis les events de Unity 5.6. mais j'ai découvert maintenant que le fonctionnement des boutons du menu est un peu aléatoire. (le bouton exit du menu ne marche pas à chaque fois quand on clique dessus pour fermer le menu) .. ;) mélanger deux D et trois D pose toujours probleme apparemment

j'avoue que ça me fait perdre pas mal de temps sur mon projet d'etre partout à la fois, de rechercher l'info pour savoir ce que unity peut faire pour moi et ce que je dois coder, et je me demande encore quel est la meilleure approche. Meme si les codes à realiser ne sont pas compliqués voir même chiant à faire pour un codeur (car il n'y a aucun challenge pour lui).

Mon usage de Unity m'a montré jusqu'ici que ce n'est pas la modelisation le plus difficile (si on a les bons outils) mais le gameplay et sa programmation... et quand on ne connait pas le code csharp ou javascript ç'est un peu hard. Mais étant designer de metier, la pratique me permet de mieux comprendre la difficulté de comprehension entre les designers et les codeurs.

apres mettre casser la tete avec Three.js, je trouve que Unity est devenu un outil assez bien foutu pour travailler en equipe...

lauraneb
Messages : 30
Inscription : 01 Juin 2017 14:14

Re: [DB-AL] fermer un menu au clic en dehors

Message par lauraneb » 05 Juin 2017 11:59

simonj a écrit :Je ne comprends pas.

Selon la configuration de tes menus effectivement il faut désactiver/activer aussi le background cliquable ou en mettre plusieurs si tu as plusieurs écrans. Mais ça ne me semble pas réellement être un problème... Peut être que je ne comprends pas bien ce que tu veux faire exactement. Mais il me semble très facile d'adapter ce système avec des configurations de menu très variés (Soit un seul objet, soit plusieurs objets, soit des objets créés dynamiquement, ...)
par contre je viens de comprendre ta methode. comme le bouton est sur le canvas, et que le canvas est screenspace overlay des que je clique quelque part sur le canvas, il le referme (avec le bouton) et donc je peux cliquer à nouveau sur les sprites dans la 3D :)

Répondre

Revenir vers « L'interface GUI »