IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Unity Discussion :

problème intéraction scroll rect + script IPointerEnterHandler


Sujet :

Unity

  1. #1
    Membre expérimenté Avatar de Tonton Nico
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 398
    Points : 1 320
    Points
    1 320
    Par défaut problème intéraction scroll rect + script IPointerEnterHandler
    Salut tout le monde,

    J'ai un petit soucis et j'aurais besoin de vos lumières

    Je veux faire un menu d'évènements ou en entrant des codes promos les joueurs peuvent avoir des bonus. J'ai voulu visualiser les codes bloqués et débloqués via des images et comme je compte en rajouter au fur et a mesure des versions, j'ai fais une zone de scrolling.
    Pour ce faire donc j'ai simplement fait une "IMAGE" avec un "Scroll Rect" + un "Mask" qui permet de se balader sur la totalité des images de codes disponibles via un "scrollbar", jusque la rien de sorcier vous me direz.

    J'ai aussi mis un script sur les images en utilisant l"eventdata" pour faire appel aux "IPointerEnterHandler" et "IPointerExitHandler", qui permet dans le jeu d'afficher un panneau d'information en plein milieu de l'écran. Ici quand on "entre" donc dans une image je voulais donner une petite description pour aider à trouver le code (très simpliste), par exemple si je vais sur l'image du milieu "WARGAMES" cela affiche ce petit message:

    Nom : events.png
Affichages : 169
Taille : 166,0 Ko

    Mais forcément je me suis fait avoir, jusque la tout fonctionnais dans les autres menus sauf ici car comme vous l'aurez surement devinez, si l'image que l'on survole est pile dans la zone du panneau d'information, quand on entre dedans ça trigger le IPointerEnterHandler qui affiche le panneau d'information... qui trigger le IPointerExitHandler qui cache le panneau d'information .... et ainsi de suite ce qui fait un scintillement/saccade du panneau d'information comme pour l'images "WARGAMES" dans le screen

    J'ai tenté en vain de résoudre en rajoutant une variable en plus pour les images susceptible d'être dans le panneau d'information (images du milieu donc) pour ne plus faire trigger le IPointerExitHandler de l'image mais du panneau d'information lui même mais vu qu'il y a un scrollbar et donc que les images ne sont pas à des zones bien fixes, cela donne un panneau d'information qui reste afficher alors qu'on se balade sur l'écran ce qui ne va pas du tout

    Je ferais une vidéo si nécessaire.
    Je n'arrive pas à voir une solution simple, je pourrais déplacer la zone du panneau d'information ou mes images pour que cela ne coïncide jamais mais ça fait un peu bricolage, sinon après cela me semble bien compliquer pour détecter ou est l'image et si elle est dans la zone panneau d'information hmmm.


    Merci d'avance pour vos retour et si avez des questions n'hésitez pas!

    TontonNico
    TontonNico

    On me dit souvent que je ressemble à Einstein... mais plutôt à Frank que Albert

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Une solution très simple : la tooltip ne se cache que si l'on sort de l'image et que l'on est sorti de la tooltip
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre expérimenté Avatar de Tonton Nico
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 398
    Points : 1 320
    Points
    1 320
    Par défaut
    Salut Bousk,

    En voila une idée qu'elle est bonne, j'ai déjà eu la même mais sans réussir l'implémentation c'est surement que j'ai merdé quelque part, je retrouve les scripts et je les mets ici

    TontonNico
    TontonNico

    On me dit souvent que je ressemble à Einstein... mais plutôt à Frank que Albert

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    C'est de l'algo des plus basiques, que perso j'avais trouvé et mis en place quand je faisais du wéb il y a une dizaine d'années étant étudiant
    - quand tu entres sur l'image
    > afficher tooltip
    > booléen "je suis dans l'image" = true
    - quand tu entres sur la tooltip
    > booléen "je suis sur la tooltip" = true
    - quand tu sors de l'image
    > "je suis dans l'image" = false
    > si "je suis sur la tooltip" vaut false
    >> cacher tooltip
    - quand tu sors de la tooltip
    > "je suis sur la tooltip" = false
    > si "je suis dans l'image" vaut false
    >> cacher tooltip

    faut juste gérer les entrées avant les sorties, et si tu contrôles pas ça tu mets un genre d'état intermédiaire pour retarder l'exécution à la frame suivante
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre expérimenté Avatar de Tonton Nico
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 398
    Points : 1 320
    Points
    1 320
    Par défaut
    Oui c'est surement des plus basiques mais cela me pose soucis quand même, pour moi ca rejoins ce que tu dis car je ne vois pas ma variable d'état quand on entre dans la tooltip qui change donc pour moi c'est:

    1. OnPointerEnter de l'image
    2. OnPointerExit de l'image
    et ça boucle que la dessus, le OnPointerEnter du panneau d'information n'a pas le temps de s'activer, j'ai cherché l'ordre d'application des OnPointer sans succès hier soir comme tu dis que pour faire en sorte que mon OnpointerEnter du panneau d'affichage s'active avant le OnpointerExit de l'image
    Après j'ai même réfléchis à un moment que comme le panneau d'information spawn directement sous la souris, le Enter ne s'activera jamais peut être et j'ai chercher plutôt un OnPointerOver (à lier au panneau d'information) mais sans succès dans les API de l'eventdata
    Je vais revoir pour trouver un moyen de le gérer comme tu préconises vu qu'il n'y a pas l'air d'avoir de solution miracle, j'étais sur la bonne voie (je n'ai pas chercher pendant 4 jours non plus donc avec d'autre mot clés j'aurais peut être de la chance)

    Après c'est peut être tout simplement mon script qui est complètement à l'ouest sans que je m'en rends compte, ci dessous le dernier jus que j'ai fais hier soir si je ne dis pas de bêtise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    public class Information : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
    {
        public string NomInformation;
        public GameObject PanneauInformation;
        public ControlleurJeu ControlleurJeu;
     
        // Use this for initialization
        void Start()
        {
            ControlleurJeu = GameObject.FindWithTag("ControlleurJeu").GetComponent<ControlleurJeu>();
        }
     
        // Update is called once per frame
        void Update()
        {
     
        }
     
        public void OnPointerEnter(PointerEventData eventData)
        {
     
            if(NomInformation == "PanneauInformation")
            {
     
                ControlleurJeu.PANNEAUINFORMATION.EstDansPanneau = true;
            }
            else
            {
     
                ControlleurJeu.PANNEAUINFORMATION.EstDansImage = true;
     
            }
             AffichePanneauInformation();
        }
     
        public void OnPointerExit(PointerEventData eventData)
        {
            if (NomInformation == "PanneauInformation")
            {
                ControlleurJeu.PANNEAUINFORMATION.EstDansPanneau = false;
            }
            else
            {
                ControlleurJeu.PANNEAUINFORMATION.EstDansImage = false;
            }
            CachePanneauInformation();
        }
        public void CachePanneauInformation()
        {
            if (!ControlleurJeu.PANNEAUINFORMATION.EstDansPanneau && !ControlleurJeu.PANNEAUINFORMATION.EstDansImage )
            {
                PanneauInformation.SetActive(false);
            }
     
        }
     
        public void AffichePanneauInformation ()
        {
     
            PanneauInformation.SetActive(true);
            GameObject.Find("TextePanneauInformation").GetComponent<Text>().text = ControlleurJeu.TraductionTexte(NomInformation); //je charge le bon texte d'information dans la bonne langue
     
        }
     
     
     
    }
    TontonNico
    TontonNico

    On me dit souvent que je ressemble à Einstein... mais plutôt à Frank que Albert

  6. #6
    Membre expérimenté Avatar de Tonton Nico
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 398
    Points : 1 320
    Points
    1 320
    Par défaut
    Salut tout le monde,

    Au final n'ayant pas trouvé comment gérer l'ordre des triggers OnPointerEnter() et OnPointerExtit() entre deux différents GameObjet, j'ai fais au plus simple:

    Il ne faut pas que je check mes états EstDansImage et EstDansPanneau comme je le faisais dans ma Public void CachePanneauInformation() (cf mon premier bout de code plus haut dans ce sujet) mais dans le Public Void Update() pour laisser le temps entre deux frames pour que tous les triggers aient le temps de se déclencher:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    using UnityEngine.EventSystems;
    using System;
     
    public class Information : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
    {
        public string NomInformation;    
        public ControlleurJeu ControlleurJeu;
     
        // Use this for initialization
        void Start()
        {
            ControlleurJeu = GameObject.FindWithTag("ControlleurJeu").GetComponent<ControlleurJeu>();        
        }
     
        private void Update()
        {
            if (ControlleurJeu.PANNEAUINFORMATION.EstDansPanneau == false && ControlleurJeu.PANNEAUINFORMATION.EstDansImage == false)
            {
                ControlleurJeu.PANNEAUINFORMATION.PanneauInformation.SetActive(false);
            }
        }
     
        public void OnPointerExit(PointerEventData eventData)
        {
            if (NomInformation == "PanneauInformation")
            {
                ControlleurJeu.PANNEAUINFORMATION.EstDansPanneau = false;
            }
            else
            {
               ControlleurJeu.PANNEAUINFORMATION.EstDansImage = false;          
            }            
     
     
        }
        public void OnPointerEnter(PointerEventData eventData)
        {
     
            if (NomInformation == "PanneauInformation")
            {
                ControlleurJeu.PANNEAUINFORMATION.EstDansPanneau = true;
            }
            else
            {
                ControlleurJeu.PANNEAUINFORMATION.EstDansImage = true;
                ControlleurJeu.PANNEAUINFORMATION.PanneauInformation.SetActive(true);
                GameObject.Find("TextePanneauInformation").GetComponent<Text>().text = ControlleurJeu.TraductionTexte(NomInformation);
            }
     
        }
     
    }
    Encore merci Bousk pour ton aide, je passe en résolu

    TontonNico
    TontonNico

    On me dit souvent que je ressemble à Einstein... mais plutôt à Frank que Albert

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Problème de backup par script PHP
    Par bagu dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 30/04/2006, 16h51
  2. Problème pour exécuter un script Perl
    Par jungle360 dans le forum Langage
    Réponses: 5
    Dernier message: 23/04/2006, 14h37
  3. [JText Area] problème de scroll
    Par mrshoki dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 13/03/2006, 17h22
  4. [Newbie] Problème d'appel de script perl
    Par NoCoZ dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 21/02/2006, 17h43
  5. problème de scroll
    Par elfugu dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 28/11/2005, 16h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo