Page 2 sur 2
Re: espacer régulièrement 4 GameObjects de taille différentes
Publié : 01 Avr 2023 15:51
par juliuson
Re: espacer régulièrement 4 GameObjects de taille différentes
Publié : 03 Avr 2023 16:56
par juliuson
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:
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]
Re: espacer régulièrement 4 GameObjects de taille différentes
Publié : 03 Avr 2023 17:56
par boubouk50
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.
Re: espacer régulièrement 4 GameObjects de taille différentes
Publié : 03 Avr 2023 18:07
par juliuson
Salut,
Désolé mais votre code n'est pas génial,
voici ce qu'il donne :
De plus les espaces entre les 2 capsules ci-dessous sont trop important:
et c'est pesque le même que chez moi:
En espérant du code pour espacer d'un même écart tous les préfabs (avec les shapeU).
Encore merci,
A+
Re: espacer régulièrement 4 GameObjects de taille différentes
Publié : 03 Avr 2023 18:46
par boubouk50
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 ?
Re: espacer régulièrement plusieurs GameObjects de taille différentes
Publié : 03 Avr 2023 19:05
par juliuson
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+.
Re: espacer régulièrement 4 GameObjects de taille différentes
Publié : 04 Avr 2023 08:37
par boubouk50
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.
Re: espacer régulièrement 4 GameObjects de taille différentes
Publié : 05 Avr 2023 16:09
par juliuson
Désolé mais votre code n'est pas terrible,
en effet il y a un problème d'espacement,
voir ci-dessous :
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:
Tout marche bien, mais pas avec le rectangle.
C'est le rectangle qui ne marche pas.
Encore merci,
A+
Re: espacer régulièrement 4 GameObjects de taille différentes
Publié : 06 Avr 2023 09:07
par boubouk50
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.
Re: espacer régulièrement 4 GameObjects de taille différentes
Publié : 06 Avr 2023 15:18
par juliuson
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.