158 votes

Comment le modèle StartCoroutine / yield return fonctionne-t-il réellement dans Unity ?

Je comprends le principe des coroutines. Je sais comment obtenir le standard StartCoroutine / yield return pour travailler en C# dans Unity, par exemple invoquer une méthode qui renvoie IEnumerator via StartCoroutine et dans cette méthode faire quelque chose, faire yield return new WaitForSeconds(1); pour attendre une seconde, puis faire autre chose.

Ma question est la suivante : que se passe-t-il réellement en coulisses ? Que fait StartCoroutine vraiment ? Qu'est-ce que IEnumerator es WaitForSeconds de retour ? Comment le StartCoroutine retourner le contrôle à la partie "autre chose" de la méthode appelée ? Comment tout cela interagit-il avec le modèle de concurrence d'Unity (où beaucoup de choses se passent en même temps sans utiliser de coroutines) ?

-2voto

Alexhawkburr Points 9

Les fonctions de base dans Unity que vous obtenez automatiquement sont la fonction Start() et la fonction Update(), donc les Coroutines sont essentiellement des fonctions tout comme la fonction Start() et Update(). N'importe quelle vieille fonction func() peut être appelée de la même façon qu'une Coroutine peut être appelée. Unity a évidemment fixé certaines limites pour les Coroutines qui les rendent différentes des fonctions ordinaires. Une des différences est qu'au lieu de

  void func()

Vous écrivez

  IEnumerator func()

pour les coroutines. Et de la même manière, vous pouvez contrôler le temps dans les fonctions normales avec des lignes de code telles que

  Time.deltaTime

Une coroutine a une gestion spécifique de la manière dont le temps peut être contrôlé.

  yield return new WaitForSeconds();

Bien que ce ne soit pas la seule chose possible à faire à l'intérieur d'un IEnumerator/Coroutine, c'est l'une des choses utiles pour lesquelles les Coroutines sont utilisées. Vous devriez faire des recherches sur l'API de script d'Unity pour apprendre d'autres utilisations spécifiques des Coroutines.

-2voto

StartCoroutine est une méthode pour appeler une fonction IEnumerator. Elle est similaire à l'appel d'une simple fonction void, la différence étant que vous l'utilisez sur des fonctions IEnumerator. Ce type de fonction est unique car il vous permet d'utiliser une fonction spéciale de type rendement notez que vous devez retourner quelque chose. C'est tout ce que je sais. Ici, j'ai écrit une simple jeu de scintillement Sur le texte méthode dans l'unité

    public IEnumerator GameOver()
{
    while (true)
    {
        _gameOver.text = "GAME OVER";
        yield return new WaitForSeconds(Random.Range(1.0f, 3.5f));
        _gameOver.text = "";
        yield return new WaitForSeconds(Random.Range(0.1f, 0.8f));
    }
}

Je l'ai ensuite appelé à partir de l'IEnumerator lui-même.

    public void UpdateLives(int currentlives)
{
    if (currentlives < 1)
    {
        _gameOver.gameObject.SetActive(true);
        StartCoroutine(GameOver());
    }
}

Comme vous pouvez le voir, j'ai utilisé la méthode StartCoroutine(). J'espère vous avoir aidé d'une manière ou d'une autre. Je suis moi-même un débutant, alors si vous me corrigez, ou si vous m'appréciez, n'importe quel type de retour d'information serait formidable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X