Сопрограмма Unity (MEC) не вызывается

#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 как я уже сказал в нижней части ответа 😉