Le OnMouseUp réagit uniquement lors du deuxième clic

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
juliuson
Messages : 121
Inscription : 03 Mai 2017 18:00

Le OnMouseUp réagit uniquement lors du deuxième clic

Message par juliuson » 14 Juin 2025 15:23

Voici ce que je fais: si je dépose le pentamino dans la grille bleue, désactiver le cube (cubes[0].SetActive(false)) sinon , si le pentamino ne se trouve pas dans la grille bleue (hors de la grille) réactiver le cube (cubes[0].SetActive(true).

Et voici ce que je code pour executer ce que je viens de décrire:

Code : Tout sélectionner

  void OnMouseUp()
    {
        if (selectedFigure == null)
            return;

        int casesValides = 0;
        List<Vector2Int> positionsValides = new List<Vector2Int>();
        Vector3 origin = grilleRouge.objArray[index].transform.position;

        foreach (Transform box in selectedFigure)
        {
            int x = Mathf.FloorToInt((box.position.x - (origin.x - 0.8f)) / 1.6f);
            int z = Mathf.FloorToInt((box.position.z - (origin.z - 0.8f)) / 1.6f);

            if (z >= 0 && z < grid.GetLength(0) &&
                x >= 0 && x < grid.GetLength(1) &&
                grid[z, x] == 0)
            {
                casesValides++;
                positionsValides.Add(new Vector2Int(x, z));
            }
        }

        if (casesValides == 5)
        {
            foreach (var pos in positionsValides)
                grid[pos.y, pos.x] = 1;

            Debug.Log("✅ Pentamino bien placé, cube désactivé.");
            align.cubes[0].SetActive(false); // ✅ on désactive le cube
        }
        else
        {
            Debug.Log("❌ Pentamino mal placé, cube réactivé.");
            align.cubes[0].SetActive(true); // ❌ on réaffiche le cube
        }
    }
Voici ma question: Pourquoi lors du premier clic OnMouseUp si je dépose le pentamino dans la grille, le cube ne disparait pas (je dis bien lors du premier clic, ensuite tout marche (avec le deuxième , ou troisième clic onMouseUp, etc), le cube disparait bien).
Avez vous des idées.

Merci à vous,
A+

juliuson
Messages : 121
Inscription : 03 Mai 2017 18:00

Re: Le OnMouseUp réagit uniquement lors du deuxième clic

Message par juliuson » 15 Juin 2025 20:47

Voici ma question:
La scène est constitée d'un pentamino, d'une grille bleue et d'un cube rouge.
comment désactiver le premier cube lors du OnMouseUp (cubes[0].SetActive(false)) si on dépose le pentamino dans la grille (isPlacedU = true)).
Teste si les 5 cubes du pentamino sont dans la grille bleue.
Pourquoi ce code ne marche pas, si vous pouvez corriger ce code.

-Dans le fichier onMouseUp.cs:

Code : Tout sélectionner

        if (casesValides == 5)
        {
            foreach (var pos in positionsValides)
            {
                grid[pos.y, pos.x] = 1;
            }

            isPlacedU = true;
        }
        else
        {
            isPlacedU = false;
        }
    }
- Et là le code qui teste isPlacedU (pour afficher ou supprimer le cube)

Code : Tout sélectionner

void OnMouseUp()
    { 

        if (mouseUp.isPlacedU)
            align.cubes[0].SetActive(false);  // ✅ le pentamino est bien placé
        else
            align.cubes[0].SetActive(true);   // ❌ le pentamino est hors grille

        isDragging = false;
    }
Merci pour votre aide,
A+

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

Re: Le OnMouseUp réagit uniquement lors du deuxième clic

Message par boubouk50 » 16 Juin 2025 10:25

De ce que je lis, les deux fonctions sont placées dans un OnMouseUp. Comment détermines-tu que le OnMouseUp de onMouseUp se fasse avant celui qui teste isPlacedU ?
Il ne faut donc pas tester isPLacedU mais faire un appel à une fonction qui va le déterminer.

Code : Tout sélectionner

public bool IsPlacedU ()
{
        if (casesValides == 5)
        {
            foreach (var pos in positionsValides)
            {
                grid[pos.y, pos.x] = 1;
            }

            isPlacedU = true;
        }
        else
        {
            isPlacedU = false;
        }
        
        return isPlacedU;
}

Code : Tout sélectionner

void OnMouseUp()
    { 
        if (mouseUp.IsPlacedU ())
            align.cubes[0].SetActive(false);  // ✅ le pentamino est bien placé
        else
            align.cubes[0].SetActive(true);   // ❌ le pentamino est hors grille

        isDragging = false;
    }
La version courte :

Code : Tout sélectionner

isPlacedU = (casesValides == 5);
if (isPlacedU) 
{
	foreach (var pos in positionsValides)
                grid[pos.y, pos.x] = 1;
}
return isPlacedU;

Code : Tout sélectionner

void OnMouseUp()
{ 
        align.cubes[0].SetActive(!mouseUp.IsPlacedU ()); 
        isDragging = false;
}
"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

juliuson
Messages : 121
Inscription : 03 Mai 2017 18:00

Re: Le OnMouseUp réagit uniquement lors du deuxième clic

Message par juliuson » 16 Juin 2025 16:34

Mrci pour toun aide Boubouk50,
J'ai testé le code suivant :

-dans le fichier mouseUp.cs

Code : Tout sélectionner

public bool IsPlacedU ()
{
        if (casesValides == 5)
        {
            foreach (var pos in positionsValides)
            {
                grid[pos.y, pos.x] = 1;
            }

            isPlacedU = true;
        }
        else
        {
            isPlacedU = false;
        }
        
        return isPlacedU;
}
-avec dans le fichier clicCube.cs:

Code : Tout sélectionner

void OnMouseUp()
    { 
        if (mouseUp.IsPlacedU ())
            align.cubes[0].SetActive(false);  // ✅ le pentamino est bien placé
        else
            align.cubes[0].SetActive(true);   // ❌ le pentamino est hors grille

        isDragging = false;
    }
Le problème c'est que le code ne marche pas.
En effet le cube ne disparait pas si on dépose le pentamino dans la grille pour la première fois (le cube disparait bien à partir du deuxième, troisième, etc clic OnMouseUp).
Il n'a que le premier clic qui ne marche pas.

Avez vous des idées,
A+

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

Re: Le OnMouseUp réagit uniquement lors du deuxième clic

Message par boubouk50 » 16 Juin 2025 16:54

On ne peut pas tester pour toi.
Donc aide nous en les faisant :
  • que vaut casesValides lors du premier OnMouseUp ?
  • que vaut selectedFigure ?
  • que valent grid[z, x] ?
"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

juliuson
Messages : 121
Inscription : 03 Mai 2017 18:00

Re: Le OnMouseUp réagit uniquement lors du deuxième clic

Message par juliuson » 16 Juin 2025 17:58

-casesValides vaut 5 si le pentamino (composé de 5 cubes) est entièrement relaché dans la grille.
-selectedfigure est la variable suivante: private Transform selectedFigure (c'est le pentamino);
-grid[z, x] dépend des cases dans lesquels on a déposé les cubes du pentamino.
Il vaut 1 si un cube d'un pentamino est dans la grille bleue.

Le vrai problème est le suivant:
Pourquoi le cube ne se supprime pas lors du pemier clic OnMouseUp (le relachement du pentamino dans la grille)(cube.SetActive(false)).
Si le pentamino est dans la grille, le cube doit disparaitre (cube.SetActive(false).
Sinon, si il est déposé hors de la grille, le cube doit réaparaitre (cube.SetActive(true)).).
A partir du deuxième, troisième, etc clic tout marche.
Il n'y a que le premier clic qui ne marche pas (il ne supprime pas le cube si on dépose le pentamino dans la grille pour la première fois).

Avez vous des idées,
A+

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

Re: Le OnMouseUp réagit uniquement lors du deuxième clic

Message par boubouk50 » 16 Juin 2025 18:05

Ce n'est pas ce que je te demande...

Si ça ne marche pas du premier coup, c'est surement parce qu'une des variables ou des conditions n'est pas remplie.
Donc quelles sont leurs valeurs au premier onMouseUp ?
"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

juliuson
Messages : 121
Inscription : 03 Mai 2017 18:00

Re: Le OnMouseUp réagit uniquement lors du deuxième clic

Message par juliuson » 16 Juin 2025 18:55

Ma vraie question est la suivante :

La scène est composée d'un pentamino, d'une grille et d'un cube.

Si le pentamino est déposé dans la grille, le cube doit disparaitre (cube.SetActive(false).
Sinon, si il est déposé hors de la grille, le cube doit réaparaitre (cube.SetActive(true)).).
A partir du deuxième, troisième, etc clic tout marche.

Pourquoi est ce qu'il n'y a que le premier clic OnMouseUp qui ne marche pas.
En effet il ne supprime pas le cube si on dépose le pentamino dans la grille pour la première fois).

Merci pour ton aide,
A+

Répondre

Revenir vers « Scripting »