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);
}
}
}