espacer régulièrement 4 GameObjects de taille différentes

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

espacer régulièrement 4 GameObjects de taille différentes

Message par franceschi julien » 23 Mars 2023 15:45

Bonjour à tous,

j'essaye d'espacer régulièrement 4 GameObjects de taille différentes (une capsule, un rectangle composé de 4 cubes, un cube et une autre capsule, voir image tout en bas).
Voici le code:

Code : Tout sélectionner

 void Start()
    {
        longueurCapsule = 1;
        longueurRectangle = 3;
        longueurCube = 2;

        Vector3 posCapsule = new Vector3(0, 0, 0);
        Vector3 posRectangle = posCapsule + new Vector3(longueurCapsule, 0, 0) + new Vector3(space, 0, 0);
        Vector3 posCube = posRectangle + new Vector3(longueurRectangle, 0, 0) + new Vector3(space, 0, 0);
        Vector3 posCapsule2 = posCube + new Vector3(longueurCube, 0, 0);

        for (int i = 0; i < numberOfRectangles; i++)
        {
            int numberOfCubes = Random.Range(minCubesPerRectangle, maxCubesPerRectangle + 1);

            for (int j = 0; j < numberOfCubes; j++)
            {
                Vector3 cubePosition = posCapsule;

                if (j == 0)
                {
                    cubePosition = posCapsule;
                }
                else if (j == 1)
                {
                    cubePosition = posRectangle;
                }
                else if (j == 2)
                {
                    cubePosition = posCube;
                }
                else if (j == 3)
                {
                    cubePosition = posCapsule2;
                }

                Instantiate(cubePrefab[j], cubePosition, Quaternion.identity);
            }
        }
    }
Voilà ce que j'obtiens:
Image

et voilà ce que je voudrais (esacement régulier avec des GameObjects de taille différentes):

Image

Si vous pouvez m'aider à faire fonctionner mon code,

Merci à vous,

A+

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

Re: espacer régulièrement 4 GameObjects de taille différentes

Message par boubouk50 » 23 Mars 2023 17:10

Il faut que tu tiennes compte des tailles de chacun des objets:
L'écart entre 2 éléments vaut la place que le 1e à droite de son pivot + l'écartement + la place que le 1e à gauche de son pivot.
Ici admettons que les objets soient centrés.
a/ Tu positionnes le premier objet (le cylindre).
b/ Tu positionnes le second au même endroit puis tu le déplaces de la moitié de la taille du cylindre (son rayon donc) + l'écartement + la moitié de la taille de lui même. Il est au bon endroit.
Tu recommences avec le 3e élément à partir de b/.

Les pivots ne seront pas forcément centrés. Il faut donc calculer la partie gauche et droite qui dépassent du pivot. Tu pourras les calculer facilement avec les Bounds des colliders ou des meshRenderer.
"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: espacer régulièrement 4 GameObjects de taille différentes

Message par franceschi julien » 23 Mars 2023 18:39

Je positionne bien le deuxième GameObject (le rectangle) à la position du premier GameObject (la capsule).

Vector3 posRectangle = posCapsule

D'après l'onglet Inspector la taille de la capsule est de 1.


Puis je déplace de la moitié de la taille de la capsule (1 / 2 = 0.5f).

Vector3 posRectangle = posCapsule + new Vector3(0.5f, 0, 0)

J'ajoute l'écartement (2f) + la moitié de la taille de lui même (2 / 2= 1).

 Vector3 posRectangle = posCapsule + new Vector3(0.5f, 0, 0)+ espace + new Vector3(1, 0, 0);

Mais cela n'espace pas les GameObjects.
La capsule et le rectangle se mélangent entre eux.

Sivous avez des idées ou mieux du code,


ils sont les bienvenus.

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

Re: espacer régulièrement 4 GameObjects de taille différentes

Message par boubouk50 » 23 Mars 2023 19:02

De ce que je comprends, tu positionnes les objets en fonction d'un random. Donc déjà pour savoir ou il ira...
Ensuite tu les positionnes a des positions fixes : posCapsule et autres sont déterminés. Donc si j vaut la même valeur 2 fois de suite, les deux objets seront à la même place. Il te manque l'ajout d'un intervalle en fonction de i.

Bon, le pb est plus profond, cet algo est très rigide et bourrin.
Là de suite, j'ai pas le temps d'approfondir, peut etre je pourrais demain.
"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: espacer régulièrement 4 GameObjects de taille différentes

Message par franceschi julien » 23 Mars 2023 19:05

Merci à toi boubouk50.

J'attends ton code avec impatience.
En fait je cherche du code pour espacer régulièrement 4 GameObjects de taille différentes le long des axes X.

Merci

A+

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

Re: espacer régulièrement 4 GameObjects de taille différentes

Message par boubouk50 » 24 Mars 2023 09:45

Je préférerai qu'avec les explications que je t'ai donné, tu avances un peu dans la résolution de ton propre algo plutôt que je me farcisse le travail, personnellement... ;-) D'autant plus que ton algo n'est pas assez "juste" pour comprendre exactement tes contraintes.
Dois-je supposer que la taille d'un "rectangle" est aléatoire et composé de cubes successifs de dimension 1 à maxCubesPerRectangle ?
Est-ce que les objets instanciés sont prédéfinis ? Capsules et cubes de taille fixe ?
Qu'est ce que numberOfRectangles? Que représente-t-il?

Avant discuter code, mieux vaut discuter besoin. Parce que je suis sur que ton algo ne reflète pas ton besoin.
Donne moi donc les contraintes de départ (j'ai X prefabs représentant chacun un objet, certains sont composés de sous objets, etc) et ton objectif final (pas d'espacer des objets, ça je l'ai).
"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: espacer régulièrement 4 GameObjects de taille différentes

Message par franceschi julien » 24 Mars 2023 17:32

Bonjour,

La taille d'un "rectangle" est bien aléatoire et composé de cubes successifs de dimension 1 à maxCubesPerRectangle.

Les objets instanciés sont prédéfinis dans l'onglet 'Project'.
On y trouve des capsules, des cubes, des sphères, des rectangles (composés de plusieurs cubes de 1 unité) et autres GameObject.
Les GameObject sont de tailles différentes (dans ce programme le nombre de cubes du rectangle est une valeur aléatoire qui va de minCubesPerRectangle à maxCubesPerRectangle). Personnellement je choisis la valeur 4 pour les deux.

Les Capsules ont pour taille 1, le rectangle 4 le et cube 2.
Mais j'espère rajouter d'autres GameObjects préfabs avec d'autres tailles.

De plus numberOfRectangles représente le nombre de cubes dont le rectangle est composé (voire la valeur que l'ordinateur à choisi aléatoirement entre minCubesPerRectangle et maxCubesPerRectangle).:

Personnellement je cherche à coder pour esacer régulierement des GameObjects préfabs de taille différentes (voir image ci-dessous)
Image

Du code est le bienvenue, car je ne vois pas d'où vient l'erreur.

Merci à toi,

A+

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

Re: espacer régulièrement 4 GameObjects de taille différentes

Message par franceschi julien » 25 Mars 2023 18:18

Salut à tous,

J'ai revu mon code et voilà ce qu'il donne:

Code : Tout sélectionner

public class gpt : MonoBehaviour
{
    public GameObject object0;
    public GameObject object1;
    public GameObject object2;
    public GameObject object3;
    public GameObject object4;
    GameObject[] prefabs;
    void Start()
    {
        prefabs = new GameObject[4]; // Initialisation du tableau

        prefabs[0] = object1;
        prefabs[1] = object2;
        prefabs[2] = object3;
        prefabs[3] = object4;

        // Tailles des objets
        float size1 = prefabs[0].GetComponent<Renderer>().bounds.size.x;
        float size2 = prefabs[1].GetComponent<Renderer>().bounds.size.x;
        float size3 = prefabs[2].GetComponent<Renderer>().bounds.size.x;
        float size4 = prefabs[3].GetComponent<Renderer>().bounds.size.x;

        // Espacement désiré
        float spacing = 1.0f;

        // Position initiale
        float positionX = -10f;

        // Position du premier objet
        float startX = positionX - ((size1 + size2 + size3 + size4 + spacing * 3) / 2) + size1 / 2;

        // Positionnement des objets
        prefabs[0].transform.position = new Vector3(startX, prefabs[0].transform.position.y, prefabs[0].transform.position.z);
        prefabs[1].transform.position = new Vector3(startX + size1 + spacing, prefabs[1].transform.position.y, prefabs[1].transform.position.z);
        prefabs[2].transform.position = new Vector3(startX + size1 + spacing + size2 + spacing, prefabs[2].transform.position.y, prefabs[2].transform.position.z);
        prefabs[3].transform.position = new Vector3(startX + size1 + spacing + size2 + spacing + size3 + spacing, prefabs[3].transform.position.y, prefabs[3].transform.position.z);

        for (int i = 0; i < 4; i++)
        {

            float xPos = startX;
            if (i > 0)
            {
                xPos += spacing; // ajouter espacement pour les prefabs suivants
            }
            Instantiate(prefabs[i], new Vector3(prefabs[i].transform.position.x, prefabs[i].transform.position.y, prefabs[i].transform.position.z), Quaternion.identity);
        }
    }
}
Le problème c'est que le rectangle se place sur la capsule, ou la capsule sous le rectangle.
Si vous pouvez m'aider à espacer le rectangle et la capsule.
Voici une image qui en dit plus:

Image

Merci pour votre aide,

A+

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

Re: espacer régulièrement 4 GameObjects de taille différentes

Message par franceschi julien » 27 Mars 2023 12:42

Salut à tous,

J'ai encore purifié mon code et voici ce qu'il donne :

Code : Tout sélectionner

public class gpt : MonoBehaviour
{
    public GameObject[] prefabs; // tableau de prefabs à positionner
    public float[] prefabSize; // taille des prefabs
    public float spacing; // espacement entre les prefabs
    public Vector3 startPosition; // position initiale de la première prefab

    void Start()
    {
        float width = 0;
        if (prefabs.Length > 0)
        {
            Renderer renderer = prefabs[0].GetComponent<Renderer>();
            if (renderer != null)
            {
                width = renderer.bounds.size.x;
                Debug.Log("La longueur est de: " + width);
            }
        }

        int numPrefabs = prefabs.Length;
        float totalWidth = numPrefabs * width + (numPrefabs - 1) * spacing;
        float startX = startPosition.x - totalWidth / 2 + ((float)prefabs.Length / 2);

        for (int i = 0; i < numPrefabs; i++)
        {
            Vector3 position = new Vector3(startX + i * (width + spacing), startPosition.y, startPosition.z);
            Instantiate(prefabs[i], position, Quaternion.identity);
        }
    }
}
De plus le Debug.Log(width) renvoie 1 (la taille du rectangle devrait être 3).
Voilà le résultat lorsque je modifie les préfabs (GameObject) dans l'inspector:
Image
et dans la scène :

Image

Merci pour votre aide,

A+

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

Re: espacer régulièrement 4 GameObjects de taille différentes

Message par boubouk50 » 27 Mars 2023 14:37

franceschi julien a écrit :
27 Mars 2023 12:42
De plus le Debug.Log(width) renvoie 1 (la taille du rectangle devrait être 3).
Ton code renvoie 1 et c'est la bonne valeur.

Code : Tout sélectionner

Renderer renderer = prefabs[0].GetComponent<Renderer>();
if (renderer != null)
{
     width = renderer.bounds.size.x;
     Debug.Log("La longueur est de: " + width);
}
Ici, tu récupères la largeur du prefab à l'index 0 de ton tableau de prefab. Donc la capsule dont la largeur vaut 1.
Il faut donc que tu récupères la largeur pour chacun de tes objets au fur et à mesure de leur instanciation.
En gros:
j'initialise la position de départ et la taille précédente (0)
Puis pour chacun de mes prefabs présent dans le tableau:
  • Je récupère (et stocke) sa taille
  • Je le positionne en fonction de sa largeur et de l'emplacement de l'élément précédent (taille et position stockée).
  • Je stocke sa position (utile pour placer le suivant)
Tu y es presque !
"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

Répondre

Revenir vers « Scripting »