Jump to content
Unity Insider Forum

problem: unitywebrequest with couroutine with return, alternative mit async


AtD

Recommended Posts

Hallo. Ich bin neu hier und auch ealtiv neu zu Unity, C# und coiding allgemein. Daher probiere und recherchiere ich ewig, nur zu diesem Problem habe ich bis jetzt keine Lösung gefunden. 

Zunächst mein Ziel: Von Unity(C#) aus, steuere PHP-File an, um von der MySQL-Datenbank die Informationen zu erhalten. Nach dem ich die Infos mit Unity vom PHP-File erhalte, will ich die Infos direkt in einer anderen Funktion umsetzen. 
Also so würde es ungefähr aussehen:

main (){ // activated from a button

      resievedString = get_Cell_from_PHPFile();

      this_is_functions_with_that_string(resievedString )

}

Und das habe ich erfolglos ausprobiert: zunächst mit Coroutine, mit dem Ergebniss, dass this_is_functions_with_that_string( ) zuerst mit leeren Argument gerufen wird:

get_Cell_from_PHPFile(){

        StartCoroutine(Call_PHPPhile());

}

IEnumerator Call_PHPPhile(){

      ..some code for the form to send to PHP_File..

       www.SendWebRequest();

      yield return www.downloadHandler.text;

}

Dann habe ich versucht  auf yield und IEnumerator zu verzichten, mit dem Resultat, dass ich von PHP-file gar nichts zurück bekomme. Es wird eine Fehler ausgegeben, dass ich die Funktion aus Start() rufen soll. Doch auch das funktioniert nicht. :

get_Cell_from_PHPFile(){

      ..some code..

       www.SendWebRequest();

      return www.downloadHandler.text;

}

 

Dann habe ich von Async und Wait gehört:

 public string ZwischenSpeicher;

    public void Test_FunctionFortheBtn()
    {
        Calling_Head_SsyncFunctions();
    }


    private async void  Calling_Head_SsyncFunctions()
    {
        var result = await Async_Function_should_GO_first();
        MethodAfter_StartCoRoutine(ZwischenSpeicher);
    }

    private async Task<bool>  await  Async_Function_should_GO_first()
    {
        bool result = false;
        await Task.Run(() =>
        {
            StartCoroutine(Call_PHP_File());
            result = true;
        });
        return result;
    }  
    IEnumerator Call_PHP_File()
    {
        ...some code for the form to send to PHP_File..
        yield return www.SendWebRequest();
        ZwischenSpeicher = www.downloadHandler.text;  

    }

Ich wäre wirklich dankbar, wenn mir jemand mit einem Ratschlag helfen könnte. 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Von async und wait würde ich ganz stark abraten aktuell. Das ist noch nicht annähernd in Unity brauchbar, zumindest nicht ohne eine zusätzliche Bilbiothek.

Wie du UnityWebRequest benutzen kannst, steht hier: https://docs.unity3d.com/ScriptReference/Networking.UnityWebRequest.Get.html

using (UnityWebRequest webRequest = UnityWebRequest.Get(uri))
{
  yield return webRequest.SendWebRequest();

  if (webRequest.isNetworkError)
  {
    DoErrorStuffWith(webRequest.error);
  }
  else
  {
    DoStuffWith(webRequest.downloadHandler.text);
  }
}

Denke daran, dass Coroutinen zwar technisch gesehen nicht asynchron sind, aber durch ihre Unterbrechungen über mehrere Frames hinweg laufen können. Im Gegensatz zu async/await können sie keine Werte zurückgeben. Wenn du mit dem Ergebnis des Requests etwas machen willst, musst du das je nach Situation in die Coroutine einbauen oder über ein Callback regeln. Ersteres ist auf jeden Fall die einfachere Variante, nur halt nicht immer die bessere.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...