Partage
  • Partager sur Facebook
  • Partager sur Twitter

Alignement d'objets instantiés et avec une positio

Sujet résolu
    22 janvier 2019 à 11:24:52

    Bonjour.

    Je cherche à positionner des objets en fonctions de leur taillle .le premier doit e^tre à la position 0,0,0 et les suivants à cotés.

    Ces objets sont des instanciations de préfabs avec une position aléatoire.

    Voici mon code.

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.EventSystems;
    using System.Linq;
    
    public class ObjectGenerator : MonoBehaviour
    {
    
        //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.parent = 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;
        }
    
        public void DeleteGameObject()
        {
            GameObject biggestObject = BiggestObject();
           for (int i = 0; i < m_Objects.Count;i++)
           {
                if (biggestObject != null)
                {
                    Destroy(biggestObject);
                    m_Objects.Remove(biggestObject);
                }
           }
           
            
        }
    
            //trier les cubes par scale (grandeur)
            public void SortObjectBySize()
            {
            //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];
                Vector3 newPos = new Vector3(0,0.4f,0);
    
                if (i==0)
                {
                    obj.transform.localPosition = newPos;
                }
               else
                {
                  
                    
                }
                
    
            }
    
        }

    Merci pour vorte aide

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      22 janvier 2019 à 18:04:20

      Il faudrait peut-être expliquer quel est le problème, où ça coince, quels sont les résultats, est-ce que ça compile, etc. On sera plus à même d'apporter de l'aide avec ces informations.
      • Partager sur Facebook
      • Partager sur Twitter
        23 janvier 2019 à 8:57:39

        Le problème est dans la fonction SortObjectBySize dans la boucle ,j'arrive à positionner le 1er mais dans le else , je n'arrive pas à positionner les suivants
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          23 janvier 2019 à 17:20:22

          Pour la boucle, c'est plutôt moche de mettre le cas i=0 à l'intérieur de la boucle. C'est mieux d'initialiser la variable avant la boucle pour ne pas avoir à faire de if à l'intérieur.

          Pour positioner les suivants, il faut se poser les bonnes questions :

           - quel doit être l'écart entre deux objets ?

           - comment implémenter ça ? utiliser une variable que l'on met à jour ? autre chose ?

          • Partager sur Facebook
          • Partager sur Twitter

          Alignement d'objets instantiés et avec une positio

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown