[RESOLU][BD-AL] Repositionner des objets instancier par prefab avec position et grandeur aléatoire par ordre de grandeur

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
rina
Messages : 9
Inscription : 20 Mars 2017 18:41

[RESOLU][BD-AL] Repositionner des objets instancier par prefab avec position et grandeur aléatoire par ordre de grandeur

Message par rina » 23 Jan 2019 14:47

Bonjour,

Je cherche à repositionner des objets qui ont été instanciés par script selon leur ordre de grandeur.
Dans le script, ces objets ont une position et une taille aléatoire.
J'arrive à positionner le premier mais pas le reste .
Cependant ,m^me le premier n'est pas à 0.0.0
Voici mon code :

Code : Tout sélectionner

/Trier cube et les positionner par grandeur
    //supprimer l'objet du plus grand au plus petit (pour cela,faire une fonction biggest object)
    //</summary>

    public GameObject m_ObjectPrefab;
    public Vector3 m_ObjectSpawnMinPos;
    public Vector3 m_ObjectSpawnMaxPos;
    public float m_ObjectMinScale = 1;
    public float m_ObjectMaxScale = 2;
    public List<GameObject> m_Objects;

    private GameObject parentTransform;
    private int m_StartCounter;

    // Start is called before the first frame update
    void Start()
    {
        parentTransform = GameObject.Find("ObjectGenerator");
        m_Objects = new List<GameObject>();
    }

    public void Update()
    {
        //!EventSystem.current.IsPointerOverGameObject() = si on ne clique pas sur l'élement de l'UI
        if (Input.GetMouseButtonDown(0) && !EventSystem.current.IsPointerOverGameObject())
        {
            CreateObject();
        }
    }
    public void CreateObject()
    {
        Vector3 position = new Vector3(Random.Range(m_ObjectSpawnMinPos.x, m_ObjectSpawnMaxPos.x), Random.Range(m_ObjectSpawnMinPos.y, m_ObjectSpawnMaxPos.y), Random.Range(m_ObjectSpawnMinPos.z, m_ObjectSpawnMaxPos.z));
        GameObject obj = Instantiate(m_ObjectPrefab, position, Quaternion.identity);
        // Attacher le game object au parent 
        obj.transform.SetParent(parentTransform.transform);
        // Appliquer un scale random à l'objet
        float scale = Random.Range(m_ObjectMinScale, m_ObjectMaxScale);
        obj.transform.localScale = Vector3.one * scale; //Vector3=Vector3 (1,1,1);
        m_Objects.Add(obj);
        //change la couleur de chaque objet
        obj.GetComponent<Renderer>().material.color = Random.ColorHSV();
        //on change le nom de l'objet en fonction de son ordre d'apparition:
        //on doit compter le nombre d'objet instantier
        m_StartCounter++;
        //on change le nom
        obj.name = "Objet" + " " + m_StartCounter+" "+obj.transform.localScale.magnitude;
    }

    //chercher l'objet le plus grand
    public GameObject BiggestObject()
    {
        GameObject biggestObject = null;
        for (int i = 0; i < m_Objects.Count; i++) //on parcourt la liste
        {

            //le premier est le plus gros
            if (i == 0)
            {
                biggestObject = m_Objects[i];
            }
            else
            {
                if (m_Objects[i].transform.localScale.magnitude>biggestObject.transform.localScale.magnitude)
                {
                    biggestObject = m_Objects[i];
                }

            }

        }
        return biggestObject;
    }

   //trier les cubes par scale (grandeur)
        public void SortObjectBySize()
        {
        Vector3 position = new Vector3(0,0.4f,0);
      
        //float spacing = 1f;
        List<GameObject> sortedBySizeObjects = new List<GameObject>(m_Objects);
            sortedBySizeObjects = sortedBySizeObjects.OrderBy(go => go.transform.localScale.magnitude).ToList();

         for (int i = 0; i < sortedBySizeObjects.Count; i++)
         {
            
            //on trie la liste selon magnitude
            GameObject obj = sortedBySizeObjects[i];
            if(i==0)
            {
                obj.transform.localPosition = position;
            }
        else
            {
                obj.transform.localPosition += position;
            }

         
         }
        
        }
    public void DeleteGameObject()
    {
        GameObject biggestObject = BiggestObject();
        for (int i = 0; i < m_Objects.Count; i++)
        {
            if (biggestObject != null)
            {
                Destroy(biggestObject);
                m_Objects.Remove(biggestObject);
            }
        }


    }
Merci par avance de votre aide
Dernière édition par rina le 24 Jan 2019 15:04, édité 1 fois.

Avatar de l’utilisateur
Sebela
Messages : 141
Inscription : 25 Juin 2014 21:39

Re: [BD-AL] Repositionner des objets instancier par prefab avec position et grandeur aléatoire par ordre de grandeur

Message par Sebela » 23 Jan 2019 15:11

Hello Marina,

Il faudrait un peu plus d'infos pour comprendre ce que tu essayes de faire.
Plusieurs choses :
- Tes objets sont spawn aléatoirement au départ, donc ça peut ne pas être cohérent au niveau du tri après. J'ai l'impression que tu veux faire un tri selon l'axe y. Donc si par exemple tu veux qu'ils soient spawn aléatoirement sur X et de façon ordonnée sur Y, tu devrais setter ta position initiale comme ceci :

Code : Tout sélectionner

Vector3 position = new Vector3(Random.Range(m_ObjectSpawnMinPos.x, m_ObjectSpawnMaxPos.x), 0, Random.Range(m_ObjectSpawnMinPos.z, m_ObjectSpawnMaxPos.z));
Ensuite, veux-tu que les objets soient à une distance égale les uns des autres ? Ou que la distance soit déterminée par le scale ?
Tu peux simplement faire :

Code : Tout sélectionner

for (int i = 0; i < sortedBySizeObjects.Count; i++)
         {
            
            //on trie la liste selon magnitude
            GameObject obj = sortedBySizeObjects[i];
		obj.transform.position += Vector3.up * i;
Comme ta liste est déjà ordonnée, tu utilises l'indice pour trier selon l'axe y avec un pas d'espace régulier.

Si ce n'est pas ce que tu cherches à faire, il va falloir m'en dire plus ;)

rina
Messages : 9
Inscription : 20 Mars 2017 18:41

Re: [BD-AL] Repositionner des objets instancier par prefab avec position et grandeur aléatoire par ordre de grandeur

Message par rina » 23 Jan 2019 15:22

Merci de ta réponse,
Je vais essayer.
On veut l'aligner sur l'axe X en fonction de la taille
et soit à distance égale les un des autres

rina
Messages : 9
Inscription : 20 Mars 2017 18:41

Re: [BD-AL] Repositionner des objets instancier par prefab avec position et grandeur aléatoire par ordre de grandeur

Message par rina » 24 Jan 2019 15:00

Merci j'ai trouvé
Merci Sebela car c'etait presque ça

C'était ça:

Code : Tout sélectionner

  public void SortObjectBySize()
        {
        Vector3 objectPosition= Vector3.one;
        
        List<GameObject> sortedBySizeObjects = new List<GameObject>(m_Objects);
            sortedBySizeObjects = sortedBySizeObjects.OrderBy(go => go.transform.localScale.magnitude).ToList();

        for (int i = 0; i<sortedBySizeObjects.Count; i++)
        {

            //rajout Kinematic par code
         
            //on trie la liste selon magnitude
            GameObject obj = sortedBySizeObjects[i];
            
            // Position
            obj.transform.localPosition = objectPosition;

            // Rotation
            obj.transform.localRotation = Quaternion.identity;
          
            // Increment position for next object
            objectPosition.x += obj.transform.localScale.x + m_Spacing;

            objRigidBody.isKinematic = true;
            objRigidBody.detectCollisions = false;



        }

Avatar de l’utilisateur
Sebela
Messages : 141
Inscription : 25 Juin 2014 21:39

Re: RESOLU_[BD-AL] Repositionner des objets instancier par prefab avec position et grandeur aléatoire par ordre de grand

Message par Sebela » 24 Jan 2019 19:04

De rien :) et bien joué :super:
ps : Dans ton code, l'espacement dépend quand même du scale. ;) mais à priori le positionnement aléatoire est suffisamment bien réparti pour que cela te convienne ^^
Si tu veux vraiment un espacement équivalent partout, il faudra plutôt se baser sur l'index de ton array ;-)

rina
Messages : 9
Inscription : 20 Mars 2017 18:41

Re: [RESOLU][BD-AL] Repositionner des objets instancier par prefab avec position et grandeur aléatoire par ordre de gran

Message par rina » 25 Jan 2019 11:02

L'exercice de mon maitre de stage était bien que l'espacement dépende du scale

Répondre

Revenir vers « (C#) CSharp »