Tracer une grille 6x10

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

Tracer une grille 6x10

Message par juliuson » 19 Août 2023 12:49

Salut à tous,

Voici ma question:

Comment créer une grille 6x10 centrée dans la scène avec un quadrillage noir d'un pixel de large et des cases de 33 pixels de large.
J'ai essayé le code suivant :
public class grille : MonoBehaviour
{
    public GameObject cellPrefab; // Le prefab de la cellule
    public Vector2Int gridSize; // Dimensions de la grille (6x10 dans ce cas)
    public float cellSize = 1.0f; // Taille de chaque cellule

    private void Start()
    {
        CreateGrid();
    }

    private void CreateGrid()
    {
        for (int x = 0; x < gridSize.x; x++)
        {
            for (int y = 0; y < gridSize.y; y++)
            {
                Vector3 spawnPosition = new Vector3(x * cellSize, 0, y * cellSize);
                GameObject cell = Instantiate(cellPrefab, spawnPosition, Quaternion.identity);
                cell.transform.SetParent(transform);
            }
        }
    }
}
Voici ce que je souhaite faire (sans le contour):

Image

El le cellPrefab est le suivant:

Image

Le problème est que le code ne trace pas de grille.

Votre aide est la bienvenue,

A+

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

Re: Tracer une grille 6x10

Message par jmhoubre » 19 Août 2023 14:24

Bonjour,

bizarre que tu n'as pas trouvé de réponse dans ce forum, il me semble que le sujet a été traité plusieurs fois.

En tout cas, sur la chaîne YT de CodeMonkey, il y a cet épisode qui répond à ta question : Grid System in Unity (Heatmap, Pathfinding, Building Area)

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

Re: Tracer une grille 6x10

Message par juliuson » 19 Août 2023 15:15

Bonjour,

Je viens de rentrer le code du tutoriel :

Mais le code ne reconnait pas
using CodeMonkey.Utils;
Mais je suis toujours à la recherche de code pour faire une grille.

J'ai aussi essayé ce code:
public class grille : MonoBehaviour
{
    public int rows = 6;
    public int columns = 10;
    public float cellSize = 1.0f;
    public Material lineMaterial; // Matériau pour les lignes

    private void Start()
    {
        Vector3 startPos = transform.position;

        // Dessiner les lignes horizontales
        for (int i = 0; i <= rows; i++)
        {
            Vector3 start = startPos + new Vector3(0, i * cellSize, 0);
            Vector3 end = start + new Vector3(columns * cellSize, 0, 0);
            Debug.DrawLine(start, end, Color.black, Mathf.Infinity, false);
        }

        // Dessiner les lignes verticales
        for (int i = 0; i <= columns; i++)
        {
            Vector3 start = startPos + new Vector3(i * cellSize, 0, 0);
            Vector3 end = start + new Vector3(0, rows * cellSize, 0);
            Debug.DrawLine(start, end, Color.black, Mathf.Infinity, false);
        }
    }
}
Mais le code ne trace pas de lignes et de colonnes.

Avez-vous une idée,

Merci pour votre aide,

A+

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

Re: Tracer une grille 6x10

Message par jmhoubre » 20 Août 2023 10:45

using CodeMonkey.Utils correspond à une bibliothèque de fonctions fournie gratuitement par CodeMonkey sur son site. Lire la description de la vidéo.

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

Centrer une grille 6x10 dans la scène

Message par juliuson » 20 Août 2023 15:11

Salut à tous,

J'arrive à peut près à tracer une grille (je crée 2 images noir une de 33x2 et une autre de 2x33).
Et avec les boucles i et j je trace le quadrillage de la grille avec les 2 images (une pour les lignes horizontales et une autre pour les lignes verticales).

Le problème c'est que je n'arrive pas à centrer la grille au centre de la scène.

Voici mon code:
public class grille : MonoBehaviour
{
    public Image horizontalLinePrefab;
    public Image verticalLinePrefab;
    public int numRows = 6;
    public int numColumns = 10;
    public float cellSize = 33f;

    private void Start()
    {
        DrawGrid();
    }

    private void DrawGrid()
    {
        Vector3 centerPosition = new Vector3(0f, 0f, 0f); // Centre de la scène en coordonnées locales

        float gridWidth = numColumns * cellSize;
        float gridHeight = numRows * cellSize;

        float startX = -gridWidth / 2f + cellSize / 2f;
        float startY = gridHeight / 2f - cellSize / 2f;

        for (int row = 0; row < numRows; row++)
        {
            for (int col = 0; col < numColumns; col++)
            {
                Vector3 position = new Vector3(startX + col * cellSize, startY - row * cellSize, 0f) + centerPosition;
                CreateLine(verticalLinePrefab, position);
                CreateLine(horizontalLinePrefab, position);
            }
        }
    }

    private void CreateLine(Image linePrefab, Vector3 position)
    {
        Image newLine = Instantiate(linePrefab, position, Quaternion.identity);
        newLine.transform.SetParent(transform);
    }
}
Voici le résultat (on voit bien que la grille n'est pas du tout centrée dans la scène)

Image

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

Re: Tracer une grille 6x10

Message par jmhoubre » 20 Août 2023 17:04

Tout est expliqué dans la vidéo, même si tu n'utilises pas les fonctions fournies par Codemonkey.

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

Re: Tracer une grille 6x10

Message par juliuson » 20 Août 2023 17:15

Désolé mais le MonkeyCode utilise un Debug.Line pour tracer des lignes (et on, ne voit rien en mode Game).
Alors que moi, j'utilise des traits de UI Image noir avec des traits(images) horizontaux de 33x2 et verticaux de 2x33.

Merci beaucoup,

Si vous avez du code,

il est le bienvenue.

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

Re: Tracer une grille 6x10

Message par juliuson » 21 Août 2023 18:04

La grille est rattachée à un empty (emptyGrid).
Lorsque le programme est compilé (onglet Game) et qu'on change les valeurs de l'inspector de l'empty (emptyGrid) et du transform (en X = 0 et Y= 0), alors la grille se centre parfaitement au milieu de la grille(avec n'importe quelle taille de grille).

J'ai fait ce code:
    private void Start()
    {
        emptyGrid.position = new Vector3(0, 0, 0);
    }
Mais cela ne change pas la position de la grille.
j'ai mis les valeurs à 0 dans le mode Scene.
Maintenant le centrage fonctionne presque parfaitement, il y a juste un petit écart de 20 pixels (horizontalement et verticalement).

Si vous avez des idées?

Bien à vous,

A+

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

Re: Tracer une grille 6x10

Message par boubouk50 » 22 Août 2023 08:38

As-tu besoin que ce soit en 3D ?
Tu pourrais le faire en UI sinon, ce serait plus simple. Au lieu d'utiliser des positions monde, tu utiliserais des positions écran en pixel.

Aussi, au lieu de tracer des lignes, tu pourrais faire l'inverse et ajouter des cases grises devant un fond noir.
"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 : 102
Inscription : 03 Mai 2017 18:00

Re: Tracer une grille 6x10

Message par juliuson » 22 Août 2023 12:54

Bonjour à tous,

J'essaye de créer des cases colorées en bleu dans la grille.

Pour cela j'utilise le code suivant:
 private void Start()
    {
        Grille[1, 2] = -1;
        Grille[6, 4] = -1;
        Grille[1, 1] = -1;

        DrawGrid();
    }

    void DrawGrid()
    {
        Vector3 startPosition = transform.position;

        float horizontalOffset = Colonnes * cellSize * 0.5f - cellSize * 0.5f;
        float verticalOffset = Lignes * cellSize * 0.5f - cellSize * 0.5f;

        for (int row = 0; row <= Lignes; row++)
        {
            for (int col = 0; col <= Colonnes; col++)
            {

                //               if ((Grille[row, col] == -1) && (Grille[row, col - 1] == -1))
                {
                    Vector3 position = startPosition + new Vector3(col * cellSize - horizontalOffset, -row * cellSize + verticalOffset);
                    if (col < Colonnes)
                    {
                       CreateLine(verticalLinePrefab, position + new Vector3(cellSize / 2, 0, 0));
                    }

                    if (row < Lignes)
                    {
                        CreateLine(horizontalLinePrefab, position - new Vector3(0f, cellSize / 2, 0f));
                    }
                }
            }
        }
    }


    void CreateLine(Image linePrefab, Vector3 position)
    {
        Image newLine = Instantiate(linePrefab, position, Quaternion.identity);
        newLine.transform.SetParent(transform);
    }

}

Le problème c'est que tout le quadrillage disparaît à l'écran si j'utilise l'expression ci-dessous:
  if ((Grille[row, col] == -1) && (Grille[row, col - 1] == -1)).
Au lieu de dire de ne pas tracer la ligne verticale (verticalLinePrefab) entre les 2 cases vides et voisines (voir image ci-dessous):

Image

Merci pour votre aide,

A+
Dernière édition par juliuson le 31 Août 2023 16:04, édité 15 fois.

Répondre

Revenir vers « Scripting »