Comment attendre les opérations / coroutines asynchrones?

11

Je cherche un moyen générique / réutilisable d'attendre que les coroutines et les opérations asynchrones se terminent dans Unity 5, similaire au awaitmot clé C # 5 .

La façon la plus simple à laquelle je peux penser est quelque chose comme ceci:

 public class SomeUtility {
     public bool IsDoingSomething { get; private set; }

     public IEnumerator DoSomethingAsync() {
         IsDoingSomething = true;
         yield return new WaitForSeconds(2);
         IsDoingSomething = false;
     }
 }

puis dans une autre coroutine:

 while(!someUtilityInstance.IsDoingSomething)
     yield return null;

Cependant, ce n'est pas très agréable car il encombre le code avec des whileinstructions, n'est pas réutilisable (a besoin d'instances et de classes dédiées même pour des fonctions utilitaires simples!) Et beaucoup de singleton ou de choses statiques où il n'est même pas nécessaire.

Le plus proche que j'ai trouvé utilise celui d'Unity AsyncOperation. Cela fonctionne très bien ici:

public static IEnumerator Await(this AsyncOperation operation) {
    while(!operation.isDone)
        yield return operation;
}

yield return SceneManager.LoadLevelAsync("blaaaah").Await();

Cependant .. le problème est: comment créer un AsyncOperation? Quelques services, par exemple, l' SceneManagerutilisent, mais la documentation ne contient absolument rien sur la création d'opérations personnalisées ou l'encapsulation de coroutines existantes, etc.

Alors, existe-t-il un moyen de créer un "attente" simple, générique et réutilisable pour les coroutines personnalisées?

artganify
la source
Peut-être utiliser la réflexion et les rappels? Passez deux méthodes dans une coroutine. Le premier la méthode à faire. Utilisez la réflexion pour voir quand il se termine, puis appelez le second
Evorlor

Réponses:

1

Avec Unity 2017, vous pouvez désormais utiliser async wait comme alternative aux coroutines comme décrit ici

Steve Vermeulen
la source