Иллюстрирование процесса сортировки шаров в Unity с использованием алгоритмов сортировки - PullRequest
0 голосов
/ 26 мая 2018

Я хочу проиллюстрировать процесс сортировки по двум заменяющим шарам.Как на этом изображении; иллюстрация , но с Balls , вы можете мне помочь сделать это?

Должна быть некоторая задержка внутри цикла для иллюстрирования процесса, но я не могу сделать это правильно, и когда я нажимаю кнопку сортировки, Unity останавливается.

После рандомизации граней рандомизированных шаров равны 5 3 2 4 1, поэтому следует отсортировать 5 - 3 и показать, что сортировка затем сортирует 2 - 5, а затем 4 - 5, так что необходимо заменитьбыть проиллюстрированным.

У меня есть другие алгоритмы сортировки, такие как Selection и Bubble, но я могу сделать их сам, полагаю, смогу ли я получить ответ на этот.

Кнопки

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
using System.Collections;


namespace Assets
{
    class Gameobjects : MonoBehaviour
    {
        public Button s_YourButton;
        [SerializeField]

        public GameObject[] Balls = new GameObject[5];


        public GameObject[] instantiatedObjects= new GameObject[5];

        void Start()
        {
            Button btn = s_YourButton.GetComponent<Button>();
            //Calls the TaskOnClick method when you click the Button
            btn.onClick.AddListener(TaskOnClick);
            Balls[0] = GameObject.Find("5");
            Balls[1] = GameObject.Find("3");
            Balls[2] = GameObject.Find("2");
            Balls[3] = GameObject.Find("4");
            Balls[4] = GameObject.Find("1");
        }
        List<Vector3> vectorList = new List<Vector3>();

        void Update()
        {
            performInsertionSort(instantiatedObjects); 
        }
        void TaskOnClick()
        {
            Fill();
            //instantiatedObjects = instantiatedObjects.OrderBy(go => go.name).ToList();
            //performInsertionSort(instantiatedObjects);
            //for (int i = 0; i < instantiatedObjects.Length; i++)
            //{
            //    instantiatedObjects[i].transform.position = vectorList[i];
            //}
            string name = "1";
            string name1 = "2";
            string name2 = "3";
            string name3 = "4";
            string name4 = "5";

            GameObject go1 = GameObject.Find(name);
            GameObject go2 = GameObject.Find(name1);
            GameObject go3 = GameObject.Find(name2);
            GameObject go4 = GameObject.Find(name3);
            GameObject go5 = GameObject.Find(name4);
            //if the tree exist then destroy it
            if (go1 & go2 & go3 & go4 & go5)
            {
                Destroy(go1.gameObject);
                Destroy(go2.gameObject);
                Destroy(go3.gameObject);
                Destroy(go4.gameObject);
                Destroy(go5.gameObject);

            }
        }

        private void performInsertionSort(GameObject[] instantiatedObjects)
        {
            {
                int k = 0;
                for (int i = 0; i < instantiatedObjects.Length - 1; i++)
                {
                    int j = i + 1;

                    while (j > 0)
                    {
                        if (string.Compare(instantiatedObjects[j - 1].name, instantiatedObjects[j].name) > 0)
                        {
                            GameObject temp = instantiatedObjects[j - 1];
                            instantiatedObjects[j - 1] = instantiatedObjects[j];
                            instantiatedObjects[j] = temp;

                            while (k < instantiatedObjects.Length){

                                instantiatedObjects[k].transform.position = vectorList[k];
                        }
                            k++; 

                        }

                        j--;

                    }
                    StartCoroutine(Example());
                }
            }
        }
        IEnumerator Example()
        {
            print(Time.time);
            yield return new WaitForSeconds(0.5f);
            print(Time.time);
        }

public void Fill()
{
    vectorList.Clear();
    instantiatedObjects = new GameObject[5];
    for (int i = 0; i < Balls.Length; i++)
    {
        GameObject spawnedObject = Instantiate(Balls[i]) as GameObject;
        instantiatedObjects[i] = spawnedObject ;
        vectorList.Add(spawnedObject.transform.position);
    }
}
        }
    }

1 Ответ

0 голосов
/ 27 мая 2018

у вас много ошибок в вашем коде

Первая: Разве вы не должны писать

                `for (int i = 0; i < instantiatedObjects.Length - 1; i++)`

вместо записи

                for (int i = 0; i < instantiatedObjects.Length; i++)

без -1 Длина Beacuse начинает отсчитываться от 1, поэтому, если у вас есть пять элементов в массиве, он вернет 5, и цикл будет выполнен 5 раз, поэтому, если вы хотите добавить -1, вы должны набрать

                    for (int i = 0; i <= instantiatedObjects.Length - 1; i++)

со знаком равенства или меньше (<=) </p>

Второй: , который не следует вводить While j > 0 Поскольку он считается бесконечным циклом J = 0 +1, поэтому j> 0 будет выполнять весь код внутри цикла while, проверяет, будет ли j все еще больше нуля или нет, затем снова и снова делает весь код, поэтому пример замерзания единицы для бесконечного цикла:

int x = 0;
while(1 > 0)
{
    x++;
}

это никогда не идет из этих двух скобок, потому что это пример бесконечного цикла для конечного цикла:

int x = 0;
while(x < 10)
{
    x++
}

это конечный цикл, потому что после 11 циклов x будет равен 11, а 11 больше 10так что идет к остальной части кода в вашем скрипте

третий Вы должны набрать StartCoroutine(Example()); в начале своей функции.

четвертый - вместо этого вы должны вызывать функцию внутри fixedUpdateиз Update Поскольку внутри него вызывается сопрограмма, и всегда лучше использовать start() для сортировки только одного. Если вы использовали fixedupdte, он будет сортировать его один раз, затем будет проверять его снова и снова без конца

...