2016-12-25 7 views
0

Я пытаюсь выяснить, как правильно использовать UnityWebRequest в сопрограмму Unity, и я попробовал этот путь, но я не получить результаты:Единство UnityWebRequest сопрограммная

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
using System; 
using UnityEngine.Networking; 

public class rest : MonoBehaviour 
{ 
    public Coroutine<T> StartCoroutine<T>(IEnumerator coroutine) 
    { 
     Coroutine<T> coroutineObj = new Coroutine<T>(); 
     coroutineObj.coroutine = base.StartCoroutine(coroutineObj.InternalRoutine(coroutine)); 
     return coroutineObj; 
    } 

    public class Coroutine<T> 
    { 
     public T Value 
     { 
      get 
      { 
       if (e != null) 
       { 
        throw e; 
       } 
       return returnVal; 
      } 
     } 
     private T returnVal; 
     private Exception e; 
     public Coroutine coroutine; 

     public IEnumerator InternalRoutine(IEnumerator coroutine) 
     { 
      while (true) 
      { 
       try 
       { 
        if (!coroutine.MoveNext()) 
        { 
         yield break; 
        } 
       } 
       catch (Exception e) 
       { 
        this.e = e; 
        yield break; 
       } 
       object yielded = coroutine.Current; 
       if (yielded != null && yielded.GetType() == typeof(T)) 
       { 
        returnVal = (T)yielded; 
        yield break; 
       } 
       else 
       { 
        yield return coroutine.Current; 
       } 
      } 
     } 
    } 

    IEnumerator Start() 
    { 
     var routine = StartCoroutine<int>(TestNewRoutineGivesException()); 
     yield return routine.coroutine; 
     try 
     { 
      Debug.Log(routine.Value); 
     } 
     catch (Exception e) 
     { 
      Debug.Log(e.Message); 
      Debug.Break(); 
     } 
    } 

    IEnumerator TestNewRoutineGivesException() 
    { 
     yield return null; 
     yield return new WaitForSeconds(5f); 
     UnityWebRequest www = UnityWebRequest.Get("http://localhost:3000/api/players"); 
     www.downloadHandler = new DownloadHandlerBuffer(); 
     yield return www.Send(); 
     while (!www.downloadHandler.isDone) yield return new WaitForEndOfFrame(); 

     if (www.isError) 
     { 
      Debug.Log(www.error); 
     } 
     else 
     { 
      string results = www.downloadHandler.text; 
      yield return results; 
     } 
    } 
} 

, но если, например, мой TestNewRoutineGivesException выглядит это, то он работает

IEnumerator TestNewRoutineGivesException() 
{ 
    yield return null; 
    yield return new WaitForSeconds(5f); 
    yield return new 100; 
} 

он будет возвращать "100"

+0

Какая ошибка? –

+0

попробуйте явно создать 'www.downloadHandler' после создания объекта' www'. Я помню, что у меня были проблемы с этим. Попробуйте следующее: 'www.downloadHandler = new DownloadHandlerBuffer();' before 'yield return www.Send();' –

+0

и, возможно, на всякий случай, попробуйте подождать в сопрограмме: 'while (! Www.downloadHandler. isDone) yield return new WaitForEndOfFrame(); ' –

ответ

0

попробовать это:

public class rest : MonoBehaviour 
{ 
    void Start() 
    { 
     Coroutine routine = StartCoroutine(TestNewRoutineGivesException()); 
    } 

    IEnumerator TestNewRoutineGivesException() 
    { 
     UnityWebRequest www = UnityWebRequest.Get("http://localhost:3000/api/players"); 
     www.downloadHandler = new DownloadHandlerBuffer(); 
     yield return www.Send(); 
     while (!www.downloadHandler.isDone) 
      yield return new WaitForEndOfFrame(); 

     if (www.isError) 
     { 
      Debug.Log(www.error); 
     } 
     else 
     { 
      string results = www.downloadHandler.text; 
      DoSomethingWithTheCoroutineResult(result); 
     } 

     yield break; 
    } 

    void DoSomethingWithTheCoroutineResult(string result) 
    { 
     Debug.Log("Successfully got the result: " + result); 
    } 
} 
+0

спасибо, но это не то, что я пытаюсь сделать. Нет никакой разницы в том, чтобы сделать это стандартным, например https://docs.unity3d.com/ScriptReference/Networking.UnityWebRequest.Get.html. Я хотел иметь данные о возврате прямо под рукой, иначе это слишком грязно. Спасибо за попытку –