2016-08-26 2 views
3

Es gibt 2 C# Skripte, um das gleiche Spiel Objekt angebracht (Unity 5,4)Die Reihenfolge der Befehlsausführung in der Einheit 5 StartCoroutine/yield return www Verwendung

public class SignIn : MonoBehaviour 
{ 
    private SendRequest sendRequest; 

    void Start() 
    { 
     sendRequest = GetComponent<SendRequest>(); 
    } 

    public void signInPressed() 
    { 
     WWWForm form = new WWWForm(); 
     form.AddField("key", "value"); 

     sendRequest.POST(mainSettings.appUrl, form); 

     Debug.Log("SIGNIN"); 
    } 
} 

und

public class SendRequest : MonoBehaviour { 

    public WWW POST(string url, WWWForm form) 
    { 
     WWW www = new WWW(url, form); 

     StartCoroutine(WaitForRequest(www)); 
     return www; 
    } 

    private IEnumerator WaitForRequest(WWW www) 
    { 
     yield return www; 

     if (www.error == null) 
     { 
      Debug.Log("WWW Ok!: " + www.text); 
     } 
     else 
     { 
      Debug.Log("WWW Error: " + www.error); 
     } 
    } 
} 

Wenn ich versuchen Sie, diese Skripts zuerst Zeile SIGNIN und dann die Serverantwort auszuführen.

Wie erhalten Sie zuerst eine Antwort vom Server und dann das Programm fortsetzen? Was mache ich falsch?

Antwort

3

Werfen Sie einen Blick hier:

StartCoroutine(WaitForRequest(www)); 
return www; 

Ihre Methode gibt www Objekt ohne darauf zu warten WaitForRequest(www) zu beenden. Wenn Sie nicht www zurückgegeben von POST() Methode verwenden, warum geben Sie es zurück.

Wie um ihn zu arbeiten:

einen delegate Parameter, wenn coroutine beendet ist Feuer übergeben.

zum Beispiel:

sendRequest.POST(mainSettings.appUrl, form,() => { Debug.Log("SIGNIN");}); 

und Definition von POST():

public WWW POST(string url, WWWForm form, Action callback = null) 
{ 
    WWW www = new WWW(url, form); 

    StartCoroutine(WaitForRequest(www, callback)); 
} 

und Definition von WaitForRequest():

private IEnumerator WaitForRequest(WWW www, Action callback = null) 
{ 
    yield return www; 

    if (www.error == null) 
    { 
     Debug.Log("WWW Ok!: " + www.text); 
    } 
    else 
    { 
     Debug.Log("WWW Error: " + www.error); 
    } 

    if(callback != null) 
    { 
     callback(); 
    } 
} 

Hoffe es hilft

+0

Vielen Dank! Sehr hilfreich! – Eugene

Verwandte Themen