Сортировка массива Спрайтов по именам

Программирование на Юнити.

Сортировка массива Спрайтов по именам

Сообщение vvesnovskii 19 фев 2024, 07:14

Добрый день!
В папке Resources находятся спрайты 15 шт, имена от 1 до 15
При выгрузке спрайтов из папки Resources столкнулся с проблемой, что в массив они подгружаются не по порядке а по следующей логике, 1, 10, 11, 12, 13, 14, 15, 2, 3, и тд
В интернете не нашел конкретного решения.
Как можно рассортировать элементы чтобы они шли в порядке по возрастанию 1, 2, 3 и тд?
vvesnovskii
UNец
 
Сообщения: 10
Зарегистрирован: 02 фев 2023, 20:22

Re: Сортировка массива Спрайтов по именам

Сообщение vvesnovskii 19 фев 2024, 07:20

для справки, выгружал через крипт
spriteArray = Resources.LoadAll<Sprite>($"Sprites/{folderNumber}")
vvesnovskii
UNец
 
Сообщения: 10
Зарегистрирован: 02 фев 2023, 20:22

Re: Сортировка массива Спрайтов по именам

Сообщение Tolking 19 фев 2024, 12:18

01,02,03
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2716
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Сортировка массива Спрайтов по именам

Сообщение mastersmit 19 фев 2024, 12:19

Array.Sort()?
Аватара пользователя
mastersmit
Старожил
 
Сообщения: 558
Зарегистрирован: 12 май 2014, 14:05
Откуда: Приморский край

Re: Сортировка массива Спрайтов по именам

Сообщение vvesnovskii 19 фев 2024, 13:08

Рассматривал Array.Sort(), но в нем 17 перегрузок))
vvesnovskii
UNец
 
Сообщения: 10
Зарегистрирован: 02 фев 2023, 20:22

Re: Сортировка массива Спрайтов по именам

Сообщение vvesnovskii 19 фев 2024, 13:21

Tolking писал(а):01,02,03


Это работает.
Но опять же как быть, когда в массиве будут элементы 11 и 111, наверное, 001, 002 и тд
В общем, пока придется с этим жить)) спасибо
vvesnovskii
UNец
 
Сообщения: 10
Зарегистрирован: 02 фев 2023, 20:22

Re: Сортировка массива Спрайтов по именам

Сообщение Alkos26Rus 19 фев 2024, 14:22

vvesnovskii писал(а):
Tolking писал(а):01,02,03


Это работает.
Но опять же как быть, когда в массиве будут элементы 11 и 111, наверное, 001, 002 и тд
В общем, пока придется с этим жить)) спасибо

Если первая часть имени ресурса одинаковая а потом идет 1, 2, 3... То просто сделай функцию в которой цикл подгружает ресурсы по имени + индекс и возвращает массив
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1642
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Сортировка массива Спрайтов по именам

Сообщение 1max1 20 фев 2024, 16:33

Подсунь этот компаратор в метод сортировки.

Синтаксис:
Используется csharp
    public class NumberComparer : Comparer<string>
    {
        public static readonly NumberComparer self = new NumberComparer();

        public override int Compare(string x, string y)
        {
            if (ReferenceEquals(x, y))
                return +0;

            if (x == null)
                return -1;

            if (y == null)
                return +1;

            int l_x = x.Length;
            int l_y = y.Length;

            int min = Tools.Min(l_x, l_y);

            for (int i = 0; i < min; i++)
            {
                char c_x = x[i];
                char c_y = y[i];

                if (char.IsDigit(c_x) && char.IsDigit(c_y))
                {
                    int j_x = i + 1;
                    int j_y = i + 1;

                    for (; j_x < l_x; j_x++)
                        if (!char.IsDigit(x[j_x]))
                            break;

                    for (; j_y < l_y; j_y++)
                        if (!char.IsDigit(y[j_y]))
                            break;

                    string s_x = x.Substring(i, j_x - i);
                    string s_y = y.Substring(i, j_y - i);

                    int i_x = int.Parse(s_x);
                    int i_y = int.Parse(s_y);

                    int compare = i_x.CompareTo(i_y);

                    if (compare != 0)
                        return compare;

                    i += j_x - i - 1;
                }
                else
                {
                    int i_x = c_x;
                    int i_y = c_y;

                    int compare = i_x.CompareTo(i_y);

                    if (compare != 0)
                        return compare;
                }
            }

            return l_x.CompareTo(l_y);
        }
    }
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 6