Изображения появляются в разном порядке каждый раз, когда я вхожу в сцену - PullRequest
0 голосов
/ 15 мая 2018

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

Это код:

public GameObject contentRef;
public RawImage imgPrefab;

void Start()
{
DownloadtheFiles();
}

public void DownloadtheFiles()
{

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

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));
        });
}
}


public IEnumerator DownloadImages(string downloadUrl, int index)
{
var www = new WWW(downloadUrl);
yield return www;

//Instantiate the image prefab GameObject and make it a child of the contentRef
RawImage newImg = Instantiate(imgPrefab, contentRef.transform);
//Change the name
newImg.name = "Image-" + index;

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

//Apply the downloaded image
newImg.texture = tex;
}

А это скриншоты разных мест изображения, когда я вхожу в сцену дважды:

enter image description here enter image description here

1 Ответ

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

API WWW предназначен для того, чтобы он не блокировал вашу игру Unity при ее использовании.Этот поток управляется с сопрограммой с помощью yield return www; для ожидания запроса до его завершения.Вы используете цикл for для вызова функции DownloadImages, которая загружает изображения.Проблема в том, что вызов WWW не блокирует запрос и завершается в зависимости от размера данных / изображения и того, сколько времени потребовался серверу для ответа.

Если вы хотите, чтобы изображения загружались вдля этого необходимо сделать функцию DownloadtheFiles функцией сопрограммы вместо функции void.После этого, когда вы вызываете StartCoroutine(DownloadImages(response.Url, index));, дождитесь его возврата или завершения, прежде чем продолжить цикл for.Обычно для этого используется простой yield return, но, поскольку вы звоните StartCoroutine из лямбды, обратный вызов с Action здесь более уместен.Вы можете использовать переменную boolean с Action, чтобы сообщить циклу for, что текущий DownloadImages выполнен, чтобы продолжить его.

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;

    //Instantiate the image prefab GameObject and make it a child of the contentRef
    RawImage newImg = Instantiate(imgPrefab, contentRef.transform);
    //Change the name
    newImg.name = "Image-" + index;

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

    //Apply the downloaded image
    newImg.texture = tex;

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

Другое решение - загрузить текстуры и сохранить их в списке , но не создавать их .Когда цикл for завершится, выполните сортировку List по имени, а затем создайте экземпляр RawImage из списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...