[Résolu]UI Raycast Target ne fonctionne pas

Questions techniques liées à l’utilisation d'Unity (et n'entrant pas dans le cadre d'une des sections suivantes)
EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

[Résolu]UI Raycast Target ne fonctionne pas

Message par EmileF » 18 Juil 2019 08:32

Bonjour,

Une petite question pour laquelle je n'arrive pas à trouver une réponse.

Dans mon jeu mon player peut se déplacer avec un clic au sol.

il m'arrive d'afficher un message avec un bouton pour l'éteindre.

Mais quand je clique sur le bouton, le sol enregistre le clic et fait déplacer mon player. Et ça même si je coche le Raycast Target du bouton et du panel contenant ce bouton.

Faut-il autre chose pour arriver à bloquer ce clic derrière ce message quand il est affiché ?
Dernière édition par EmileF le 18 Juil 2019 20:21, édité 1 fois.
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

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

Re: UI Raycast Target ne fonctionne pas

Message par boubouk50 » 18 Juil 2019 09:36

J'irai regarder du côté de l'Event System.
Tu as des infos comme isPointerOverGameObject qui a l'air de faire cela.
Sinon, un Raycast peut enregistrer tous les Colliders qu'il traverse, donc si tu as un élément d'UI dans le tas, tu zappes le reste.
"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

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: UI Raycast Target ne fonctionne pas

Message par EmileF » 18 Juil 2019 12:14

Merci boubouk,

mais rien n'y fait,

J'ai essayé d'utiliser isPointerOverGameObject que ce soit dans mon bouton ou pour le sol, je ne suis arrivé à rien que ce soit en vrai ou faux, Si utilisé en faux, j'ai plus rien, et en vrai pas de filtre.
Boubouk a écrit :Sinon, un Raycast peut enregistrer tous les Colliders qu'il traverse, donc si tu as un élément d'UI dans le tas, tu zappes le reste.
C'est bien ce que je pensais mais ce n'est pas mon cas. J'utilise un raycast pour détecter le sol, mais je n'utilise pas onMouseDown ou autre, le problème vient de là peut-être.

Sinon, j'utilisais le raycast dans le fixedUpdate, je l'ai mis dans l'Update, pensant que la frame pouvait compter. Mais rien ni fait.
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

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

Re: UI Raycast Target ne fonctionne pas

Message par boubouk50 » 18 Juil 2019 13:31

Techniquement, les deux événements ne sont pas liés. Tu as un clic sur un bouton et un raycast sur le sol. Il n'est donc pas possible tel quel de les relier pour déterminer lequel doit être fait.
Il faut donc faire ce lien. Je pensais que isPointerOverGameObject fonctionnerait, car il te permet de savoir si la souris est au dessus d'un élément d'UI ou non. Donc, cela te donne une indication si tu dois faire le raycast ou non.
Il faut donc trouver une autre solution, pour moi, il faut se proscrire du clic bouton et le remplacer par un raycast au clic. Dans ce cas là, tu peux déterminer les objets touchés et donc déterminer celui qui doit être fait, le bouton ou le déplacement.
J'ai eu ce problème et je pense l'avoir réglé, je regarde dans mes projets.

EDIT - j'utilise bien le IsPointerOverGameObject

Code : Tout sélectionner

void Update () {
		//Bloquer les controles en cas de Drag depuis un élément d'UI
		if (Input.GetMouseButtonDown (0)) {
			if (EventSystem.current.IsPointerOverGameObject ())
				isDraggingFromGUI = true;
		}

		//Remettre les controles en fin de Drag
		if (Input.GetMouseButtonUp (0))
			isDraggingFromGUI = false;

		//Les controles sont bloqués en fonction du drag GUI et des DialogBox
		isInputLocked = isOnGUIEvent || isDraggingFromGUI || isCapturing;
		//Debug.Log ("OnGUI " + isOnGUIEvent + "   Drag " + isDraggingFromGUI + "   Capture " + isCapturing);
	}
Donc, j'ai un script qui gère différents booléens pour savoir où j'ai cliqué et ce que je peux faire. isInputLocked est une variable statique qui peut être récupérée partout et gère le droit d'utilisation du clic. S'il vaut True alors je ne peux pas utiliser le clic autre part (essentiellement la gestion de la caméra pour ma part).
"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

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: UI Raycast Target ne fonctionne pas

Message par EmileF » 18 Juil 2019 20:20

Merci Boubouk pour tes explications.

En fin de compte. avec les debug.log, j'ai constaté que le clic sol était enregistré avant le clic sur mon bouton.
J'ai donc mis mon clic sol dans LateUpdate().
J'ai mis un boolean public accessible depuis mon bouton que j'active quand il y a un clic sur ce bouton.
Quand le boolean est actif, je n'exécute pas le clic sol, et je désactive mon boolean pour la suite.
Ca n'a pas été complètement suffisant, j'ai donc mis l'exécution du clic sol au GetMouseButtonUp au lieu de Down

Voilà donc mes sections de script
Pour le bouton UI

Code : Tout sélectionner

    public void EndMessageClick()
    {
        Player.isClickLocked = true;
        PanelMessages.SetActive(false);
    }
et dans mon player

Code : Tout sélectionner

    public bool isClickLocked;
    private void LateUpdate()
    {
        //si pas de clic sur un UI, si pas déjà en mouvement et le bouton gauche de la souris est relaché
        if (!isClickLocked && !move && Input.GetMouseButtonUp(0))
        {
            //RaycastPos est une Extension perso de Camera pour récupérer le point de clic
            dest = m_Camera.RaycastPos("Sol");
            if (dest != Vector3.zero)
            {
                dest.y = transform.position.y;
                move = true;
            }
        }
        isClickLocked = false;
    }
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Répondre

Revenir vers « Unity le logiciel »