Lignes et colonnes d'une case cliquée

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
franceschi julien
Messages : 27
Inscription : 14 Fév 2022 18:44

Lignes et colonnes d'une case cliquée

Message par franceschi julien » 22 Jan 2023 17:59

Salut à tous,

J'ai crée une grille qui renvoie la valeur de la case sur laquelle on a cliqué:
Voici le code de la grille.

Code : Tout sélectionner

    void CreateGrid()
    {
         for (float i = -Lignes / 2; i < Lignes / 2; i++)
            for (float j = -Colonnes / 2; j < Colonnes / 2; j++)
            {
                Vector3 worldPosition = new Vector3(i, 0f, j) * 1.6f;
                var obj = Instantiate(gridCellPrefab, worldPosition, Quaternion.identity, transform);
                 obj.transform.parent = empty.transform;
                obj.name = k.ToString();
                k++;
            }
Ei ici, l'endroit où je récupère la case qui à été cliquée

Code : Tout sélectionner

 void Update()
    {
        Debug.DrawRay(cube.transform.position, Vector3.down * 10, Color.red);
        RaycastHit hit;
        Ray ray = new Ray(cube.transform.position, Vector3.down);
        if (Physics.Raycast(ray, out hit))
        {
            print(hit.transform.gameObject.name);

        }

    }


Le problème, c'est que j'aimerais récupérer les valeurs de lignes et de colonnes sur laquelle on à cliqué.

Voici un exemple :
Image
Normalement ici, Après avoir cliqué sur la case 27 je devrais récupérer la valeur de cols = 6 et de lignes = 3.
Peut-être avec une formule mathématique?

Merci pour votre aide,

A+

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

Re: Lignes et colonnes d'une case cliquée

Message par jmhoubre » 23 Jan 2023 00:35

Bonsoir,

oui, il y a une formule. Il suffit de remarquer que le numéro de la case vaut le numéro de la colonne moins un fois le nombre de lignes plus le numéro de ligne moins un, et que 27 = (6 - 1) * 5 + (3 -1).
NumCase = ((NumCol - 1) * LineNumber )+ (NumLI -1)

Pour retrouver les numéros de ligne à partir du numéro de case, on utilise l'opérateur modulo, % en C# :
NumLi = (NumCase % LineNumber) + 1
NumCol = (NumCase / LineNumber) + 1 (en supposant que toutes les variables soient déclarées en integer).

Sinon pour ton code, la fonction Update () est exécutée à chaque frame (50 à 300 fois par seconde selon ta machine), et dans la plupart des cas pour rien. Tu devrais tester si un clic de souris a eu lieu :

Code : Tout sélectionner

private void Update ()
{
	if (Input.GetMouseDown(0))
	{
	        Debug.DrawRay(cube.transform.position, Vector3.down * 10, Color.red);
	        RaycastHit hit;
	        Ray ray = new Ray(cube.transform.position, Vector3.down);
	        if (Physics.Raycast(ray, out hit))
        	{
            		print(hit.transform.gameObject.name);
        	}
	}
}
Sinon, tu as une façon que je trouve assez élégante de traiter le problème : ajouter un script à ton prefab de case. Ce script contient :
- 2 champs privés pour la ligne et la colonne de la case
- une méthode publique SetCoord(int column, int line) qui renseigne les champ privés ci-dessus. Cette méthode est appelée juste après l'instantiate de la case : obj.SetCoord(i,j)
- une méthode publique GetCoord() qui renvoie un Vector2Int formé des 2 champs privés.
- implémenter la méthode Unity OnMouseClick pour qu'elle appelle GetCoord().

En plus, il faudra reprendre Create Grid pour compter de 0 à (lines -1) et de 0 à (columns - 1). Il suffit de créer un offsetY valant -lines/2 et un offsetX valant -colums/2, et de modifier worldPosition en conséquence.

Dans ta boucle , je remplacerais également i et j par x et y, il me semble que c'est plus habituel.

Remplacer 1.6f par cellSize est aussi conseillé (pas de nombre "magique" dans un code)

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

Re: Lignes et colonnes d'une case cliquée

Message par boubouk50 » 23 Jan 2023 09:48

Aussi, si tu crées dynamiquement les cases, tu peux à ce moment lui affecter un component qui contiendrait l'ID de la case.
Ou bien instancier un prefab qui aurait ce component, par ex. Comme cela, pas besoin de le calculer après coup, tu l'auras déjà fait à la création.
Tout ceci dépend évidemment du design de ton application.
"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

franceschi julien
Messages : 27
Inscription : 14 Fév 2022 18:44

Re: Lignes et colonnes d'une case cliquée

Message par franceschi julien » 23 Jan 2023 15:12

Bonjour à tous,

surtout jmhoubre.

Merci pour sa formule mathématique:
NumCase = ((NumCol - 1) * LineNumber )+ (NumLI -1)
Elle doit fonctionner à merveille, mais je ne comprends pas ce que tu entends par LineNumber.
Je suppose que NumCol est le numéro de la colonne et NumLi la Ligne de NumCase (la case cliquée).

Merci pour ton aide,

A+

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

Re: Lignes et colonnes d'une case cliquée

Message par jmhoubre » 23 Jan 2023 15:57

LineNumber <=> nombre de lignes.

franceschi julien
Messages : 27
Inscription : 14 Fév 2022 18:44

Re: Lignes et colonnes d'une case cliquée

Message par franceschi julien » 23 Jan 2023 16:25

Je ne comprends pas trop la différence entre LineNumber et NumLI.,

Merci beaucoup,

A+

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

Re: Lignes et colonnes d'une case cliquée

Message par jmhoubre » 23 Jan 2023 17:15

NumLi est le numéro de la ligne considérée : il varie de 1 à 5.
LineNumber est le nombre de lignes total, et vaut 5 dans ton cas. Change peut-être le nom de cette variable pour LinesNumber, ou totalRows si cela te parle plus.

franceschi julien
Messages : 27
Inscription : 14 Fév 2022 18:44

Re: Lignes et colonnes d'une case cliquée

Message par franceschi julien » 23 Jan 2023 21:18

Bonjour à tous,

Pour résumer le code serait le suivant:
public class grille : MonoBehaviour
{
    public int Lignes;
    public int Colonnes;
    static public Transform obj;
    int k;
    public GameObject empty;
    int NumCase, NumY, LineNumber, NumX;

 void CreateGrid()
    {
         for (float i = -Lignes / 2; i < Lignes / 2; i++)
            for (float j = -Colonnes / 2; j < Colonnes / 2; j++)
            {
                Vector3 worldPosition = new Vector3(i, 0.09f, j) * 1.6f;
                var obj = Instantiate(gridCellPrefab, worldPosition, Quaternion.identity, transform);

                obj.transform.parent = empty.transform;
                obj.name = k.ToString();
                k++;

                NumCase = ((Colonnes - 1) * Lignes) + (Lignes - 1);
                NumX = (k % Lignes) + 1;
                NumY = (k / Lignes) + 1;

                print("NumX " + NumX + " NumY " + NumY + " k " + k);
            }
}
Merci pour votre patience,

A+

franceschi julien
Messages : 27
Inscription : 14 Fév 2022 18:44

Re: Lignes et colonnes d'une case cliquée

Message par franceschi julien » 26 Jan 2023 19:04

Salut à tous,

J'ai crée une grille 5x5 et je récupère les valeurs de NumX et NumY (avec la formule mathématique).

Tout marche bien sauf que NumX affiche 0 quand il est un multiple de 5 (dimensions de la grille).
De plus NumY commence par 0.
Voici une image qui parle mieux :

Image

Merci pour votre aide,

A+

Répondre

Revenir vers « Scripting »