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

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

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

Message par juliuson » 01 Avr 2023 15:51

Salut à tous,

Je vous envoie mon nouveau code:
 void Start()
    {
        numPrefabs = prefabs.Length;
        float totalPrefabSize = 0;
        Renderer firstRenderer = null;

        // Calcul de la taille totale des prefabs
        for (int i = 0; i < numPrefabs; i++)
        {
            if (numPrefabs > 0)
            {
                firstRenderer = prefabs.GetComponent<Renderer>();
                if (firstRenderer != null)
                {
                    totalPrefabSize += firstRenderer.bounds.size.x;
                }
            }
        }

        // Calcul de la position de départ
 //       float totalWidthOfPrefabs = numPrefabs * totalPrefabSize;
        float startX = startPosition.x - (numPrefabs * totalPrefabSize) / 2f;

        // Positionnement des prefabs
        for (int j = 0; j < numPrefabs; j++)
        {
            Vector3 position = new Vector3(startX + j * (totalPrefabSize + spacing), 0, 0);
            Instantiate(prefabs[j], position, Quaternion.identity);
        }
    }


Malheureusement, les préfabs ne sont pas alignés de manière constante.
En effet les préfabs GOOD sont bien espacés, mais les BAD n'ont pas la même longueur d'espace.

De plus l'espace vaut 1 et l'espace GOOD vaut 4 ou 5.

Image

Image

Image

Image

Si vous pouvez retoucher mon code,

vous êtes les bienvenus.

A+

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

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

Message par juliuson » 03 Avr 2023 16:56

Salut à tous,

Je viens de terminer mon code, et voilà ce qu'il donne:
    void Start()
    {
        numPrefabs = prefabs.Length;
        float totalPrefabSize = 0;

        // Calcul de la taille totale des prefabs
        for (int i = 0; i < numPrefabs; i++)
        {
            Renderer prefabRenderer = prefabs.GetComponent<Renderer>();
            if (prefabRenderer != null)
            {
                float prefabWidth = prefabRenderer.bounds.size.x;
                totalPrefabSize += prefabWidth;
                if (i > 0)
                {
                    totalPrefabSize += spacing + prefabWidth;
                }
            }
        }
        // Calcul de la position de départ
        float startX = -25f;
        // Positionnement des prefabs
        for (int j = 0; j < numPrefabs; j++)
        {
            Vector3 position = new Vector3(startX + j * (numPrefabs + spacing), 0, 0);
            Instantiate(prefabs[j], position, Quaternion.identity);
        }

        Debug.Log(totalPrefabSize);
    }


Avec le rendu ici:
Image

Le problème c'est qu'elles sont trop espacées et même en essayant de mettre le spacing à 1 ou 0.5f, cela n'apporte rien.
De plus je n'arrive pas à faire fonctionner le sous menu Prefab Size dans l'onglet Inspector.
Je mets des valeurs aléatoires et cela ne change rien.

Si vous pouvez m'aider à faire diminuer l'écart qu'il y a entre les différents préfabs (de tailles différentes).

Alors, votre aide est la bienvenue.

Merci,

A+[/i
]

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6263
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 » 03 Avr 2023 17:56

Code : Tout sélectionner

public GameObject[] prefabs;
    public float spacing = 4f;
    public float startPosX = -25f;

    void Start ()
    {
        // Positionnement des prefabs
        for (int j = 0; j < prefabs.Length; j++)
        {
            // Instanciation du prefab à la position startPosX
            GameObject prefab = Instantiate (prefabs[j], new Vector3 (startPosX, 0, 0), Quaternion.identity);
            Renderer rend = prefab.GetComponent<Renderer> ();
            // On décale le prefab pour que son bord gauche soit aligné avec la position startPosX (et non pas le pivot)
            prefab.transform.Translate (prefab.transform.position.x - rend.bounds.min.x, 0f, 0f);
            // On calcule la prochaine position de départ  = le bord droit + l'espace entre chaque élément
            startPosX = rend.bounds.max.x + spacing;
        }
    }
Comme je te l'avais suggéré dans mon pseudo code du message précédent, voici ma proposition. Je l'ai fait à main levée sans la tester, mais l'algo est là. Je l'ai laissé dans le Start (), donc tu es obligé de relancer à chaque fois la scène avec un spacing et startPosX différents pour tester de nouvelles valeurs.

N'hésite pas à poser des questions si tu veux plus d'explications.
"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: espacer régulièrement 4 GameObjects de taille différentes

Message par juliuson » 03 Avr 2023 18:07

Salut,

Désolé mais votre code n'est pas génial,
voici ce qu'il donne :

Image
De plus les espaces entre les 2 capsules ci-dessous sont trop important:
Image

et c'est pesque le même que chez moi:
Image

En espérant du code pour espacer d'un même écart tous les préfabs (avec les shapeU).

Encore merci,

A+
Dernière édition par juliuson le 03 Avr 2023 19:55, édité 2 fois.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6263
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 » 03 Avr 2023 18:46

Je vois.
Comment sont constitués les prefabs? Sont-ce l'amalgame de plusieurs sous objets? Dans ce cas, il est possible que les bounds du prefab ne soit pas bons.
Dans l'image jointe, si les barres sont définies par le premier cube tout à droite, et le U par le cube à gauche, cette hypothèse pourrait coller. (J'ai symbolisé le premier cube par le 1 sur l'image)
Peux-tu donc me montrer comment sont conçus ces 2 prefabs, stp ?
Pièces jointes
TEST.png
TEST.png (9.23 Kio) Consulté 2065 fois
"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: espacer régulièrement plusieurs GameObjects de taille différentes

Message par juliuson » 03 Avr 2023 19:05

Je t'invite à regarder mon dernier message ci-dessus (je l'ai modifié entre temps).

Les préfabs sont constitués de plusieurs cubes entre eux.
Avec un cube parent qui a 4 cubes enfants (pour le shapeU) et un parent qui a pour enfants 3 cubes alignés horizontalement (pour le rectangle)

Sont-ce l'amalgame de plusieurs sous objets? Dans ce cas, il est possible que les bounds du prefab ne soit pas bons.

Je pense en effet que c'est une bonne piste, ou peut-être améliorer mon code ci-dessus.

Merci à toi,

A+.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6263
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 » 04 Avr 2023 08:37

Je viens de vérifier sur tes trois exemples (voir pièce jointe), l'espacement entre les différents objets semble identique. Simplement, le calcul du bound de chaque objet n'est pas bon parce qu'il devrait être fait sur tous les objets plutôt que le premier.

Il faut donc prendre en compte cela.

Code : Tout sélectionner

public GameObject[] prefabs;
public float spacing = 4f;
public float startPosX = -25f;

void Start ()
{
    // Positionnement des prefabs
    for (int j = 0; j < prefabs.Length; j++)
    {
        // Instanciation du prefab à la position startPosX
        GameObject prefab = Instantiate (prefabs[j], new Vector3 (startPosX, 0, 0), Quaternion.identity);
        // Récupère la somme des bounds des enfants    
        Bounds bound = GetMaxBounds (prefab);
        // On décale le prefab pour que son bord gauche soit aligné avec la position startPosX (et non pas le pivot)
        prefab.transform.Translate (prefab.transform.position.x - bound.min.x, 0f, 0f);
        // On calcule la prochaine position de départ  = le bord droit + l'espace entre chaque élément
        startPosX = bound.max.x + spacing;
    }
}

private Bounds GetMaxBounds (GameObject _parent)
{
    Bounds bounds = new Bounds (_parent.transform.position, Vector3.zero);
    // Récupérer tous les renderers des enfants
    Renderer[] rends = _parent.GetComponentsInChildren<Renderer> ();
    foreach (Renderer rend in rends)
    {
    	// Associer le bounds de l'enfant au parent
        bounds.Encapsulate (rend.bounds);
    }
    return bounds;
}
Encore une fois, ce code n'est pas testé, il faudra peut être ajuster.
Pièces jointes
TEST.png
TEST.png (36.53 Kio) Consulté 2027 fois
"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: espacer régulièrement 4 GameObjects de taille différentes

Message par juliuson » 05 Avr 2023 16:09

Désolé mais votre code n'est pas terrible,
en effet il y a un problème d'espacement,
voir ci-dessous :

Image

Si vous vous avez du code qui pourrait résoudre ces problèmes d'espacement.
Il y a peut être une piste: les rectangle est les shapeU sont constitués de cubes parents et enfants (un parent pour 4 enfants).
C'est comme si il y avait un problème avec les préfabs de plus de 1 unité (surtout avec le rectangle), voir image ci-dessous:

Image
Tout marche bien, mais pas avec le rectangle.
C'est le rectangle qui ne marche pas.

Encore merci,

A+

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6263
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 » 06 Avr 2023 09:07

Désolé mais votre code n'est pas terrible
Comment ça me donne trop envie de continuer à t'aider...

J'ai déjà donné deux fois les explications à ton problème.
Cela ne vient pas que du code, l'espacement est correctement fait en fonction des Bounds du premier Renderer du prefab. La manière dont tu as créé les prefabs, est aussi en cause.

Ici, je vois le pb de code, le bound.max.x ne tient pas compte du décalage précédent:

Code : Tout sélectionner

for (int j = 0; j < prefabs.Length; j++)
    {
        // Instanciation du prefab à la position startPosX
        GameObject prefab = Instantiate (prefabs[j], new Vector3 (startPosX, 0, 0), Quaternion.identity);
        // Récupère la somme des bounds des enfants    
        Bounds bound = GetMaxBounds (prefab);
        // On décale le prefab pour que son bord gauche soit aligné avec la position startPosX (et non pas le pivot)
        float offset = prefab.transform.position.x - bound.min.x;
        prefab.transform.Translate (offset, 0f, 0f);
        // On calcule la prochaine position de départ  = le bord droit + l'espace entre chaque élément
        startPosX = bound.max.x + offset + spacing;
    }
Je pesne que ça corrigera le pb.
"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: espacer régulièrement 4 GameObjects de taille différentes

Message par juliuson » 06 Avr 2023 15:18

Salut boubouk50,

Merci mille fois pour la correction de ton code, il marche à la perfection.
Je ne voyais pas du tout le code comme cela,

Encore merci.

Répondre

Revenir vers « Scripting »