Использование gizmos для иллюстрации процесса сортировки

#c# #unity3d

#c# #unity3d

Вопрос:

Приведенные ниже коды генерируют 10000 кубов (с использованием gizmos). Я застрял на том, как еще больше расширить код и использовать gizmos для иллюстрации процесса сортировки (перемещение кубов при нажатии кнопки мыши), признателен, если вы можете дать мне подсказку о том, как это сделать. использование UnityEngine;

  public class NewBehaviourScript : MonoBehaviour
{
int x;
int y;
int z;

int[,] array1 = new int[100, 100];
int temp;

void Start()
{



    for (x = 0; x < 100; x  )

    {
        for (y = 0; y < 100; y  )
        {
            array1[x, y] = Random.Range(0, 2);

            Debug.Log(string.Format("{0},{1},{2}", x, y, array1[x, y]));

        }
    }


}
void OnDrawGizmos()
{
    
    for (x = 0; x < 100; x  )
    {
        for (y = 0; y < 100; y  )
        {
            Vector2 pos1 = new Vector2(0   x, 0   y);
            Gizmos.DrawCube(pos1, transform.position);
            Gizmos.color = (array1[x, y] == 1) ? Color.black : Color.white;
        }
    }
}
void OnMouseDown()
{
    for (z = 0; z < 100; z  )
    {
        for (x = 0; x < 100; x  )
        {
            for (y = 0; y < 100-z; y  )
            {
                if (array1[x, y] > array1[x, y   1])
                    temp = array1[x, y];
                array1[x   1, y] = array1[x, y];
                array1[x, y] = temp;

            }
        }
    }
}
 

}

Ответ №1:

1. Возможное решение

Я даю ответ в этой части и предлагаю лучшие альтернативы ниже.

Проблема с вашим кодом заключается в том, что сортировка происходит синхронно, в пределах одного кадра. Что вы можете сделать, это переместить код сортировки в Update и немного отсортировать между каждым кадром. Это позволит вызову Gizmos вывести правильное состояние.

2. Вместо этого используйте индикатор выполнения

Вы можете использовать EditorUtility.DisplayProgressBar для отображения индикатора выполнения в редакторе. Поскольку вы используете Gizmos, которые не отображаются в сборке, это решение предполагает, что вы работаете в редакторе.

3. Используйте вычислительные буферы

В CatLikeCoding есть эта фантастическая статья об использовании вычислительных шейдеров для рисования графика в высоком разрешении. Вы можете следить за ним и отображать ход сортировки в очень высоком разрешении. Кроме того, это будет работать как в редакторе, так и во время выполнения.