#unity3d
#unity3d
Вопрос:
Я пытаюсь загрузить изображение из URL-адреса хранилища Firestore, вызвав сопрограмму (используя более эффективный ресурс сопрограмм). Однако сопрограмма не вызывается, и я не могу понять, почему…
public void displayImage(string url)
{
Debug.Log("called display image: " url);
Timing.RunCoroutine(_loadImageSingle(url));
}
public IEnumerator<float> _loadImageSingle(string url)
{
Debug.Log("Loading ....");
WWW wwwLoader = new WWW(url);
yield return Timing.WaitUntilDone(wwwLoader);
singleimg.texture = wwwLoader.texture;
}
Любые указатели действительно ценятся!
Комментарии:
1. Вы должны использовать
StartCoroutine(_loadImageSingle(url))
.
Ответ №1:
Сопрограммы в Unity имеют только IEnumerator
без какого-либо возвращаемого значения!
И затем вы должны запустить ее с помощью StartCoroutine
… Я предполагаю, что это происходит в коде, который вы не показывали?
public void displayImage(string url)
{
Debug.Log("called display image: " url);
Timing.RunCoroutine(_loadImageSingle(url));
}
private IEnumerator _loadImageSingle(string url)
{
Debug.Log("Loading ....");
WWW wwwLoader = new WWW(url);
yield return Timing.WaitUntilDone(wwwLoader);
singleimg.texture = wwwLoader.texture;
}
В общем, обратите внимание, что WWW
это устарело. Вам лучше использовать UnityWebRequestTexture.GetTexture
:
private IEnumerator _loadImageSingle(string url)
{
Debug.Log("Loading ....");
using (UnityWebRequest uwr = UnityWebRequestTexture.GetTexture(url))
{
yield return uwr.SendWebRequest();
if (uwr.isNetworkError || uwr.isHttpError)
{
Debug.Log(uwr.error);
}
else
{
// Get downloaded texture
singleimg.texture = DownloadHandlerTexture.GetContent(uwr);
}
}
}
Комментарии:
1. Понял. Большое спасибо! Теперь работает 🙂 Хотя в связанной проблеме… Я вызываю эту сопрограмму из метода, который возвращает URL-адрес загрузки из хранилища firebase:
img1_ref.GetDownloadUrlAsync().ContinueWith((Task<Uri> task) => { if (!task.IsFaulted amp;amp; !task.IsCanceled) { UnityMainThreadDispatcher.Instance().Enqueue(() => UIcontroller.displayImage(task.Result.ToString())); } });
если бы я хотел найти URL-адрес двух файлов, а затем перейти к сопрограммам для загрузки, как бы я «связал» их вместе ….?2. Это хорошо известная проблема:
ContinueWith
выполняется в фоновом потоке. Скорее используйтеContinueWithOnMainThread
для того, чтобы делать то, что указано в названии 😉 Затем либо реализовать метод для нескольких параллельных загрузок, либо для последовательных загрузок, используя, например, список строк?3. ааааааа понял… Мне действительно нужно немного почитать о потоковой обработке…. Большое спасибо за вашу помощь!
4. На самом деле WWW устарел. Вы должны использовать UnityWebRequestTexture. ( docs.unity3d.com/ScriptReference /… )
5. @Thomas как я уже сказал в нижней части ответа 😉