Page 1 sur 2

Tracer une grille 6x10

Publié : 19 Août 2023 12:49
par juliuson
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+

Re: Tracer une grille 6x10

Publié : 19 Août 2023 14:24
par jmhoubre
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)

Re: Tracer une grille 6x10

Publié : 19 Août 2023 15:15
par juliuson
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+

Re: Tracer une grille 6x10

Publié : 20 Août 2023 10:45
par jmhoubre
using CodeMonkey.Utils correspond à une bibliothèque de fonctions fournie gratuitement par CodeMonkey sur son site. Lire la description de la vidéo.

Centrer une grille 6x10 dans la scène

Publié : 20 Août 2023 15:11
par juliuson
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

Re: Tracer une grille 6x10

Publié : 20 Août 2023 17:04
par jmhoubre
Tout est expliqué dans la vidéo, même si tu n'utilises pas les fonctions fournies par Codemonkey.

Re: Tracer une grille 6x10

Publié : 20 Août 2023 17:15
par juliuson
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.

Re: Tracer une grille 6x10

Publié : 21 Août 2023 18:04
par juliuson
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+

Re: Tracer une grille 6x10

Publié : 22 Août 2023 08:38
par boubouk50
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.

Re: Tracer une grille 6x10

Publié : 22 Août 2023 12:54
par juliuson
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+