Как упорядочить экземпляр префаба под родителем в единстве?

Попытка вывести список файлов по расширению *.json. Создание экземпляра префаба под родителем, но он не будет упорядочен. Есть ли способ обновить список или упорядочить их в порядке возрастания. Цель состоит в том, чтобы загрузить и удалить файлы. Как упорядочить файлы 1,2, 3,4,5... а если там 10 файлов последний сохраненный файл должен там спуститься на 10 место под родителем?

Dictionary<int, Button> BtnList = new Dictionary<int, Button>();
public static FileInfo[] info;
GameObject lisobj;

public void ListMap()
{

    panellist.SetActive(true);
    string mainpath = Application.persistentDataPath;
    DirectoryInfo dir = new DirectoryInfo(mainpath);



    info = dir.GetFiles("*.json");


    for(int i = 1;i<=info.Length;i++)
    {
           lisobj = Instantiate(prefabpanellist);
        lisobj.transform.SetParent(Parentcontent);

            number.text = i.ToString();
            mapnamedb.text =info[i-1].Name;

        var button = lisobj.GetComponentInChildren<Button>();
        BtnList.Add(i,button);



    }
    lisobj.transform.SetParent(Parentcontent);

    Dictionary<int, Button>.ValueCollection values = BtnList.Values;

    foreach (Button btn in values)
    {

        btn.onClick.AddListener(() => Deleteinformation());


    }

}

public void Deleteinformation()
{
    var b= UnityEngine.EventSystems.EventSystem.current.currentSelectedGameObject.GetComponent<Button>();


    var mykey=BtnList.FirstOrDefault(x=>x.Value==b).Key;
    Debug.Log("Items are" + mykey);

    string mainpath = Application.persistentDataPath;
    Debug.Log("Name is " + info[mykey - 1].Name);

    //File.Delete(mainpath + info[mykey-1].);
}

Первоначально, когда я сохраняю файл в формате .json и нажимаю кнопку Listmap (чтобы отобразить список файлов, показанный на снимке экрана). Он показывает номер индекса 5 два раза. Кроме того, последний файл, который я сохранил, был назван «00000.json», но он стал первым файлом. То есть после того, как я его сохранил (список файлов), он не обновляется. Когда я нажимаю Listmap, файлы показывают один и тот же номер индекса несколько раз. Кажется, что он не обновляется, не уверен. последний сохраненный файл появляется сверху.

Как упорядочить экземпляр префаба под родителем в единстве?Как упорядочить экземпляр префаба под родителем в единстве?

Возможный дубликат Сортировка Directory.GetFiles()

BugFinder 09.04.2019 10:58

Информация @BugFinder = dir.GetFileSystemInfos(); Как получить файлы .JSON, используя это?

zyonneo 09.04.2019 11:03

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

BugFinder 09.04.2019 11:05

так же..у него тоже есть перегрузка GetFileSystemInfos(string) где можно передать *.json в

derHugo 09.04.2019 11:05

@BugFinder Влияет ли на это наименование ... Я использовал 0000 в имени файла, и оно появилось первым.

zyonneo 09.04.2019 11:07

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

BugFinder 09.04.2019 11:10

@zyonneo по умолчанию GetFiles сортирует по имени файла => начиная с 0 идет перед началом с 1, хотя также говорит MSDN:The order of the returned file names is not guaranteed; use the Sort() method if a specific sort order is required. и т. д. В данной ссылке вы можете видеть, что вместо этого они сортируются (как вы хотите) по files.OrderBy(f => f.CreationTime);

derHugo 09.04.2019 11:10

Я сохраняю их в папке. На самом деле я создаю префаб. Так что это должен быть префаб, который я должен сортировать, а не файлы, верно?

zyonneo 09.04.2019 11:15

но вы повторяете файлы и добавляете префаб для каждого файла ... поэтому вы должны отсортировать info, чтобы создать префабы в правильном порядке. Афаик SetParent всегда добавляет дочерний элемент последним ... просто чтобы убедиться, что вы также можете заглянуть в Transform.SetAsLastSibling

derHugo 09.04.2019 11:16

Я бы, кстати, вместо того, чтобы снова повторять кнопки, уже установил их непосредственно при создании экземпляра сборного...

derHugo 09.04.2019 11:18

@derHugo Да, я думаю, это то, что я пытался решить ..

zyonneo 09.04.2019 11:22

varorderedFiles = info.OrderBy(f => f.CreationTime); Теперь orderFiles содержит информацию по порядку, верно? Но я не могу ничего получить из упорядоченных файлов. mapnamedb.text =информация[i-1].Имя; вместо этого я использовал mapnamedb.text =orderedFiles[i-1].Name; показывает ошибку.

zyonneo 09.04.2019 11:35

@zyonneo «orderfiles» сверху содержит ВСЮ информацию о файле, с которой вы начали, поэтому вы должны иметь возможность получить всю информацию, которую хотели.

BugFinder 09.04.2019 11:48

@BugFinder Не получается, хотя появляется ошибка. Ошибка CS0021: невозможно применить индексирование с помощью [] к выражению типа «IOrderedEnumerable<FileSystemInfo>»...

zyonneo 09.04.2019 11:51

использовать var orderedFiles = info.OrderBy(f => f.CreationTime).ToList();

derHugo 09.04.2019 11:53

Пробовал простое исправление... if (i==infos.Length) { int aa = Parentcontent.childCount; Parentcontent.GetChild(0).SetSiblingIndex(aa - 1); } . При загрузке списка несколько номеров индексов с одинаковыми именами файлов предыдущего созданного файла

zyonneo 09.04.2019 13:59
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
16
641
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я установил все это вместе, и теперь это отлично работает для меня:

Примечание. Я закомментировал все, что не относится к примеру (или то, что вы не добавили в свой код в вопросе)

public class FilesExample : MonoBehaviour
{
    // Start is called before the first frame update
    private void Start()
    {
        ListMap();
    }

    public static FileSystemInfo[] info;

    public void ListMap()
    {
        /*
         * If you already called this before you already have child objects
         * So I would destroy the old ones before instantiating new ones
         */
        //foreach(Transform child in Parentcontent)
        foreach(Transform child in transform)
        {
            Destroy(child.gameObject);
        }

        //panellist.SetActive(true);

        /*
         * preferred to use streamingAssetsPath for testing
         */

        //var mainpath = Application.persistentDataPath;
        var mainpath = Application.streamingAssetsPath;
        var dir = new DirectoryInfo(mainpath);

        info = dir.GetFileSystemInfos("*.json").OrderBy(i => i.CreationTime).ToArray();

        for (var i = 1; i <= info.Length; i++)
        {
            /* 
             * Instead of instantiating I simply created new empty objects
             * just as example 
             */

            //var lisobj = Instantiate(prefabpanellist);
            var lisobj = new GameObject(i + " " + info[i - 1].Name);
            //lisobj.transform.SetParent(Parentcontent);
            lisobj.transform.SetParent(transform);

            // Though I'm sure this should already have the correct order
            // you could still do SetLastSibling to move the 
            // created/instantiated object to the bottom
            lisobj.transform.SetAsLastSibling();

            //number.text = i.ToString();
            //mapnamedb.text = info[i - 1].Name;

            /*
             * NOTE: I would simply do the buttons thing in the same
             *       loop. That saves you a lot of storing and accessing lists
             */

            //var index = i;
            //var button = lisobj.GetComponentInChildren<Button>(true);
            //button.onClick.AddListener(() => Deleteinformation(index));
        }
    }

    public void Deleteinformation(int index)
    {
        Debug.Log("Index is " + index);

        Debug.Log("Path is " + info[index].FullName);

        File.Delete( info[index].FullName);

        // update the scene list
        ListMap();
    }
}

Результат

Файлы на диске упорядочены по имени

Файлы на диске упорядочены по дате создания

результат в Unity, упорядоченный по дате создания

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

zyonneo 09.04.2019 14:55

Instatiate создает проблему. Он будет добавлен только вверху. Поэтому я использовал этот код, чтобы вывести его из последнего созданного значения списка с помощью кнопки удаления........ if (i == infos.Length) { int aa = Parentcontent.childCount; Parentcontent.GetChild(0).SetSiblingIndex(aa - 1); } ........... но когда я удаляю последний элемент, первый элемент в списке удаляется

zyonneo 09.04.2019 15:21

@derHugo..Как обновить список файлов при удалении файла.

zyonneo 10.04.2019 10:43

вы могли бы перед созданием экземпляра уничтожить всех текущих детей (foreach(Transform child in transform){ Destroy(child.gameObject); })

derHugo 10.04.2019 10:45

Информация @DerHugo..FileSystemInfo [] сохранить их в кеш?. Я дважды нажал «Воспроизвести», чтобы обновить свой список содержимым из папки. Не обновляется, когда я добавляю вызов функции ListMap() внутри Deletemap...... ..............if (Parentcontent.childCount>0) { GameObject gg = Parentcontent.GetChild(i-1).gameObject; Уничтожить (гг); Debug.Log("Имя = " + gg.name); }

zyonneo 10.04.2019 11:40

возможно ли, что File.Delete занимает некоторое время, и поэтому ListMap просто вызывается раньше?

derHugo 10.04.2019 12:11

Не время, я считаю .... Подожду некоторое время и проверю ... Также я добавил файл . кнопку «Назад» и позвольте мне снова щелкнуть Listmap. Должен ли я использовать Coroutine?

zyonneo 10.04.2019 12:20

Другие вопросы по теме