Exécution de coroutines et récupération de valeur dans Unity
Dans votre jeu Unity, vous êtes confronté à un dilemme : vous devez renvoyer la valeur d'une variable seulement après qu'une coroutine (WaitForRequest) ait fini de s'exécuter. Cependant, l'instruction return de la méthode POST s'exécute avant la fin de la coroutine, ce qui entraîne une valeur de retour incorrecte.
Comprendre les coroutines
Les coroutines dans Unity sont des fonctions suspendues qui peuvent être interrompu et repris au fil du temps. Ils permettent d'effectuer des opérations asynchrones sans bloquer le thread principal. La coroutine WaitForRequest est responsable de la mise à jour de la variable success_fail en fonction de la réponse HTTP.
Le problème
Le problème découle de l'exécution immédiate de l'instruction return dans le POST méthode. Cela se produit avant que la coroutine n'ait la possibilité de mettre à jour la variable success_fail, ce qui entraîne une valeur de retour prématurée et incorrecte.
Solution utilisant une action
Pour surmonter ce problème, vous peut utiliser un délégué d'action, une fonction sans paramètre qui accepte une variable de type int. En passant l'Action en tant que paramètre à la coroutine WaitForRequest, vous pouvez spécifier une fonction de rappel à appeler une fois la coroutine terminée.
La fonction de rappel fournie par l'Action recevra la valeur mise à jour de success_fail et vous pourrez alors utilisez-le pour effectuer d'autres actions ou renvoyer la valeur si nécessaire.
Exemple Code
Voici une version mise à jour de votre code démontrant l'utilisation d'une Action :
public int POST(string username, string passw) { WWWWWForm form = new WWWForm(); form.AddField("usr", username); form.AddField("pass", passw); WWW www = new WWW(url, form); StartCoroutine(WaitForRequest(www, (status) => { success_fail = status; // Perform other actions or return the value as needed })); // This line is no longer returning a value // as the success_fail variable is being modified asynchronously } private IEnumerator WaitForRequest(WWW www, Action<int> callback) { yield return www; if (www.error == null) { if (www.text.Contains("user exists")) { callback(2); } else { callback(1); } } else { callback(0); } }
Dans ce code, la méthode POST ne renvoie plus directement une valeur. Au lieu de cela, il lance la coroutine WaitForRequest, en passant un délégué Action comme paramètre. L'action sera appelée une fois la coroutine terminée, vous permettant d'accéder et d'utiliser la variable success_fail mise à jour.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!