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 из списка.