rectangle dans une grille 5x5

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

rectangle dans une grille 5x5

Message par franceschi julien » 23 Déc 2022 13:32

Salut à tous,

Normalement, la taille de la grille (5x5)doit correspondre à la taille du rectangle 3D (le rectangle est composé de 5 cubes de taille 1.6f).

J'utilise le code suivant :

Code : Tout sélectionner

void CreateGrid()
   {
        Vector3 gridCenter = new Vector3(Lignes / 2, 0f, Colonnes / 2); // On calcule le centre de la grille brut
        Vector3 cellCenter = new Vector3[B](1.6f[/B] / 2, 0f, [B]1.6f[/B] / 2); // On calcule le centre d'une cellule
        for (int i = 0; i < Colonnes; i++)
        {
            for (int j = 0; j < Lignes; j++)
            {
                Vector3 worldPosition = new Vector3(i , 0, j) - gridCenter + cellCenter;
                var obj = Instantiate(gridCellPrefab, worldPosition, Quaternion.identity, transform);
            }
        }
    }
J'ai mis la gridCellPrefab à 0.16f, Lignes et Colonnes à 5.
Mais cela me donne une grille trop petite.
Si vous avez une idée pour mettre la taille de la grille à la taille du rectangle (5 cubes de taille 1.6f chacun)
Ai-je une erreur de code?

Je précise que j'ai une caméra avec les paramètres suivants :
Image

Voici une vidéo qui en dit plus:
https://www.youtube.com/shorts/ISWxzy8_pzM



Merci encore,

A+

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

Re: rectangle dans une grille 5x5

Message par jmhoubre » 24 Déc 2022 12:03

Quand tu crées ta grille, tu ne tiens pas compte de la taille de ton cube. Tu devrais faire :

Code : Tout sélectionner

	Vector3 worldPosition = new Vector3 (i, 0, j) * cellSize - gridCenter;

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

Re: rectangle dans une grille 5x5

Message par franceschi julien » 24 Déc 2022 13:30

Merci pour ton aide,

J'ai rentré le code comme tu as dit (en multipliant par cellSize) :
Le défaut c'est que la grille ne se centre pas au milieu de la scène.

Code : Tout sélectionner

   void CreateGrid()
   {
        Vector3 gridCenter = new Vector3(Lignes / 2, 0f, Colonnes / 2);
        Vector3 cellCenter = new Vector3(0.8f, 0f, 0.8f);
        Vector3 cellSize = new Vector3(1.6f, 0f, 1.6f);
        for (int i = 0; i < Colonnes; i++)
        {
            for (int j = 0; j < Lignes; j++)
            {
                Vector3 worldPosition = new Vector3(i, 0f, j) * cellSize - gridCenter;
                var obj = Instantiate(gridCellPrefab, worldPosition, Quaternion.identity, transform);
            }
        }
    }
L'idée était bonne, seulement le debugger signale que l'on ne peut pas multiplier deux Vector3 entre eux.

J'ai éssayé cela :
Vector3 worldPosition = new Vector3(i, 0f, j) * 1.6 - gridCenter;
Mais la grille est un tout petit peut trop large (6 ou 7 pixels)

Merci encore,

A+
Dernière édition par franceschi julien le 24 Déc 2022 18:47, édité 2 fois.

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

Re: rectangle dans une grille 5x5

Message par jmhoubre » 24 Déc 2022 14:44

cellSize est un float.

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

Re: rectangle dans une grille 5x5

Message par franceschi julien » 24 Déc 2022 15:37

Le problème, c'est que je n'arrive pas à adapter mon rectangle à la grille.
On voit bien que la grille est un tout petit peut large pour le rectangle.
Comme vous pouvez le voire sur l'image ci-dessous :

Image

Et ici une vidéo qui en dit plus:

https://youtu.be/Z30gwE3V1M8

Bien à vous,

A+

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

Re: rectangle dans une grille 5x5

Message par jmhoubre » 24 Déc 2022 18:42

Je ne suis pas devin : il faut publier l'ensemble des scripts...

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

Re: rectangle dans une grille 5x5

Message par franceschi julien » 24 Déc 2022 18:54

Et voilà le code du déplacement et du magnétisme du rectangle (le magnétisme se trouve tout en bas du code) :

Code : Tout sélectionner

public class dragging : MonoBehaviour
{
    static public GameObject movingObject;
    Vector3 positionZero;
    Plane plane;
    void Update()
    {
        {
            if (Input.GetMouseButtonDown(0))
            {
                Ray mouseRay = GetMouseRay();
                RaycastHit hit;
                if (Physics.Raycast(mouseRay.origin, mouseRay.direction, out hit))
                {
                    movingObject = hit.transform.gameObject;
                    plane = new Plane(Vector3.up, movingObject.transform.position);
                    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                    float rayDistance;
                    plane.Raycast(ray, out rayDistance);
                    positionZero = movingObject.transform.position - ray.GetPoint(rayDistance);
                }
            }
            else if (Input.GetMouseButton(0) && movingObject)
            {
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                float rayDistance;
                if (plane.Raycast(ray, out rayDistance))
                {
                    movingObject.transform.position = ray.GetPoint(rayDistance) + positionZero;
                }
            }
            else if (Input.GetMouseButtonUp(0) && movingObject)
            {
                movingObject = null;
            }
        }
        Ray GetMouseRay()
        {
            Vector3 mousePositionFar = new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.main.farClipPlane);
            Vector3 mousePositionNear = new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.main.nearClipPlane);
            Vector3 mousePositionF = Camera.main.ScreenToWorldPoint(mousePositionFar);
            Vector3 mousePositionN = Camera.main.ScreenToWorldPoint(mousePositionNear);
            Ray mouseRay = new Ray(mousePositionN, mousePositionF - mousePositionN);
            return mouseRay;
        }
        //      Here is the code for the magnetism
        {
            var position = new Vector3(
            Mathf.Round(movingObject.transform.position.x / 1.6f) * 1.6f,
            Mathf.Round(movingObject.transform.position.y / 1.6f) * 1.6f,
            Mathf.Round(movingObject.transform.position.z / 1.6f) * 1.6f);
            movingObject.transform.position = position;
        }
    }
}
Il est un peu compliqué, mais marche parfaitement.
Le code est bonus,

Merci à vous,

A+

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

Re: rectangle dans une grille 5x5

Message par jmhoubre » 24 Déc 2022 22:40

Manque la classe qui contient CreateGrid.

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

Re: rectangle dans une grille 5x5

Message par franceschi julien » 25 Déc 2022 12:51

Je ne comprends pas ce que vous voulez dire .
Le code du createGrid est le suivant :
void CreateGrid()
   {
        Vector3 gridCenter = new Vector3(Lignes / 2, 0f, Colonnes / 2); // On calcule le centre de la grille brut
        Vector3 cellCenter = new Vector3(1.6f / 2, 0f, 1.6f / 2); // On calcule le centre d'une cellule
        for (int i = 0; i < Colonnes; i++)
        {
            for (int j = 0; j < Lignes; j++)
            {
                Vector3 worldPosition = new Vector3(i , 0, j) * 1.6f + cellCenter;
                var obj = Instantiate(gridCellPrefab, worldPosition, Quaternion.identity, transform);
            }
        }
    }
Mais la grille est à peine un peu trop large et le rectangle ne se magnétise pas avec la grille (voir mon message avec le code dragging).

Encore merci,

A+

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

Re: rectangle dans une grille 5x5

Message par jmhoubre » 25 Déc 2022 12:55

Cette fonction appartient bien à une classe non ? Merci de publier le script, cela évitera aux éventuels lecteurs de faire des hypothèses. Par exemple, Lignes est un int ou un float ? Comment est appelée CreateGrid() ?

Répondre

Revenir vers « Scripting »