Maison >développement back-end >C++ >Comment puis-je renvoyer une valeur d'une coroutine Unity une fois celle-ci terminée ?

Comment puis-je renvoyer une valeur d'une coroutine Unity une fois celle-ci terminée ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-01 11:52:09170parcourir

How Can I Return a Value from a Unity Coroutine After It Completes?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn