Быстрый просмотр изображений, загруженных с сервера - PullRequest
0 голосов
/ 17 мая 2018

У меня есть сцена, где я хочу показать несколько изображений, загруженных с сервера. Я пытаюсь загрузить текстуры и сохранить их в списке. Когда цикл for завершается, я сортирую список по имени, а затем создаю экземпляр RawImage из списка, но он не работает. Что я делаю не так?

public GameObject contentRef;
public RawImage imgPrefab;

void Start()
{
    StartCoroutine(DownloadtheFiles());
}

public IEnumerator DownloadtheFiles()
{
    yield return null;

    List<string> photolist = ES2.LoadList<string>("myPhotos.txt");

    for (int i = 0; i < photolist.Count; i++)
    {
        //Don't capture i variable
        int index = i;

        bool reqDone = false;

        new GetUploadedRequest()

            .SetUploadId(photolist[index])
            .Send((response) =>
                {
                    StartCoroutine(DownloadImages(response.Url, index,
                        (status) => { reqDone = status; }));


                    //return null;
                });

        //Wait in the for loop until the current request is done
        while (!reqDone)
            yield return null;
    }
}

public IEnumerator DownloadImages(string downloadUrl, int index, Action<bool> done)
{
    var www = new WWW(downloadUrl);
    yield return www;

    //Get the downloaded image
    Texture2D tex = new Texture2D(4, 4);
    www.LoadImageIntoTexture(tex);

    List <Texture2D> texList = new List <Texture2D> ();

    for (int i = 0; i < tex.Count; i++)
    {
        texList.Add (tex);
    }

    texList = texList.OrderBy(mtex => mtex.name).ToList();

    for (int i = 0; i < tex.Count; i++)
    {
        RawImage newImg = Instantiate(imgPrefab, contentRef.transform);
        //Change the name
        newImg.name = "Image-" + index;
        //Apply the downloaded image
        newImg.texture = tex;
    }

    //Done
    if (done != null)
        done(true);
}

}

1 Ответ

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

Ваш код RawImage должен выполняться вне функции DownloadImages, поскольку DownloadImages вызывается для загрузки изображения с URL-адреса в цикле for. Создание экземпляра RawImage должно выполняться только после завершения цикла for.

Кроме того, использование texList.OrderBy(mtex => mtex.name).ToList(); не сработает, поскольку ваша строка содержит как строку, так и int, и имеет этот формат "Image-" + 0; ". Для этого вам понадобится пользовательская функция путем разделения string и int, а затем сортировки с int.

Наконец, после завершения цикла for вам нужен способ определить, что все образы закончили загрузку, прежде чем создавать экземпляр RawImages. Это можно сделать с помощью массива или списка bool с размером List<string> photolist, который содержит ссылку для загрузки изображений. Передайте этот массив bool в DownloadImages и используйте аргумент index, чтобы установить его в true после каждой загрузки.

public GameObject contentRef;
public RawImage imgPrefab;

List<Texture2D> downloadedTextures = new List<Texture2D>();

void Start()
{
    DownloadtheFiles();
}

public void DownloadtheFiles()
{

    List<string> photolist = ES2.LoadList<string>("myPhotos.txt");

    //Used to determine when were done downloading
    bool[] doneDownloading = new bool[photolist.Count];

    //Download images only.Don't instantiate anything
    for (int i = 0; i < photolist.Count; i++)
    {
        //Don't capture i variable
        int index = i;

        new GetUploadedRequest()

            .SetUploadId(photolist[index])
            .Send((response) =>
            {
                StartCoroutine(DownloadImages(response.Url, index, doneDownloading));
            });
    }

    //Instantiate the download images
    StartCoroutine(InstantiateImages(doneDownloading));
}

//Instantiates the downloaded images after they are done downloading
IEnumerator InstantiateImages(bool[] downloadStatus)
{
    //Wait until all images are done downloading
    for (int i = 0; i < downloadStatus.Length; i++)
    {
        while (!downloadStatus[i])
            yield return null;
    }

    //Sort the images by string
    sort(ref downloadedTextures);

    //Now, instantiate the images
    for (int i = 0; i < downloadedTextures.Count; i++)
    {
        //Instantiate the image prefab GameObject and make it a child of the contentRef
        RawImage newImg = Instantiate(imgPrefab, contentRef.transform);

        //Apply the downloaded image
        newImg.texture = downloadedTextures[i];

        //Update name so that we can see the names in the Hierarchy
        newImg.name = downloadedTextures[i].name;
    }

    //Clear List for next use
    downloadedTextures.Clear();
}

//Sort the downloaded Textures by name
void sort(ref List<Texture2D> targetList)
{
    var ordered = targetList.Select(s => new { s, Str = s.name, Split = s.name.Split('-') })
    .OrderBy(x => int.Parse(x.Split[1]))
    .ThenBy(x => x.Split[0])
    .Select(x => x.s)
    .ToList();

    targetList = ordered;
}

public IEnumerator DownloadImages(string downloadUrl, int index, bool[] downloadStatus)
{
    //Download image
    var www = new WWW(downloadUrl);
    yield return www;

    //Get the downloaded image and add it to the List
    Texture2D tex = new Texture2D(4, 4);
    //Change the name
    tex.name = "Image-" + index;
    www.LoadImageIntoTexture(tex);
    downloadedTextures.Add(tex);

    downloadStatus[index] = true;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...