Page 1 sur 1

[RESOLU] [C#] Mettre en attente des coroutines selon une condition

Publié : 19 Août 2015 12:37
par julleg15
Bonjour,

j'utilise le aws sdk pour récupérer des assetbunble depuis un s3 avec la méthode Client.ListObjectsAsync et client.GetObjectAsync
mon problème est que ces méthodes sont async et qu'elle n'utilise pas le yield comme la fonction www.

Voici ma fonction start :

Code : Tout sélectionner

	IEnumerator Start(){
		yield return StartCoroutine(gettemplates()); 
		yield return StartCoroutine(Initialize());
		yield return StartCoroutine(LoadLevel (templateFolder, templateName, sceneName, true) );
		}
du coup le script initialise ma scene et essaie de loader mes bundles en meme temps qu'il charge les fichiers...
Comment travailler avec les yields /callbacks pour que ma première fonction mette en pause les deux suivantes tant qu'elle n'est pas finie d'être exécutée ?

Re: c# AWSSDK+S3+ASSETBUNDLE Async Toutes les méthodes se lancent en meme temps

Publié : 19 Août 2015 12:47
par sotec
ton problème est que les coroutines gettemplates() , Initialize() et LoadLevel () se lancent en même temps ?

Re: c# AWSSDK+S3+ASSETBUNDLE Async Toutes les méthodes se lancent en meme temps

Publié : 19 Août 2015 12:52
par julleg15
oui,

normalement le yield return permet de "sequencer" les méthodes les unes après les autres, non ?
Mais dans mon cas, mon gettemplates() possède une fonction async de AWS SDK pour loader les fichiers et le yield semble inutilisable à l'interieur de cette méthode. Je voudrais pouvoir créer un callback/yield pour attendre le loading avant de lancer la deuxième méthode ?

Re: c# AWSSDK+S3+ASSETBUNDLE Async Toutes les méthodes se lancent en meme temps

Publié : 19 Août 2015 14:07
par julleg15
pour l'instant j'ai réussi a créer un compteur de fichier a l'intérieur de ma fonction qui change un boolean downloadok=false/true.
Et j'ai ajoute une condition dans mon start :

Code : Tout sélectionner

IEnumerator Start(){
      yield return StartCoroutine(gettemplates()); 
      if (download){
         yield return StartCoroutine(Initialize());
         yield return StartCoroutine(LoadLevel (templateFolder, templateName, sceneName, true) );
      }
      }
Mais la fonction start est appelée une fois apparement et du coup mon changement de condition n'est pas pris en compte....
Et j'ai lu que de mettre du coroutine dans update est une très mauvaise idée. (fonction appelé à chaque rafraichissement).

cette histoire de yield return et callback reste confus pour moi :rouge:

Re: [C#] AWSSDK+S3+ASSETBUNDLE Async Comprendre yield return et les callbacks

Publié : 19 Août 2015 22:04
par julleg15
Bon voici la solution assez simple en fait :

- pour mettre en attente les coroutines, il suffit de :
- créer une variable public bool downloadok qui va declencher la condition
- dans chaque coroutine a mettre en attente :

Code : Tout sélectionner


IEnumerator myCoroutine(){
		while (!downloadok)
			yield return new WaitForSeconds(0.1f);
		//code de la routine
}

du coup dans la methode :

Code : Tout sélectionner

   IEnumerator Start(){
      yield return StartCoroutine(gettemplates());
      yield return StartCoroutine(Initialize());
      yield return StartCoroutine(LoadLevel (templateFolder, templateName, sceneName, true) );
      }
toutes les coroutines se lancent en meme temps mais initialize et lodlevel attendent que la condition downloadok soit true avant de s'executer.

Re: [RESOLU] [C#] Mettre en attente des coroutines selon une condition

Publié : 20 Août 2015 08:46
par sotec
c'est étrange, car les yield return Coroutine(); fonctionnent très bien chez moi :/

Re: [RESOLU] [C#] Mettre en attente des coroutines selon une condition

Publié : 20 Août 2015 17:57
par julleg15
la j'utilise une méthode de AWS SDK qui n'utilise pas les yield, donc je n'arrivais pas a renvoyer simplement une information d'attente, sachant que les deux coroutines suivantes ont besoin que la première coroutine soit finie.
Avec un www y'a pas de problème, mais ca ne corresponds pas à mes besoins.

Re: [RESOLU] [C#] Mettre en attente des coroutines selon une condition

Publié : 21 Août 2015 11:53
par artemisart
D'après la doc http://docs.aws.amazon.com/AWSUnitySDK/ ... tions.html ça marche avec des callbacks :

Code : Tout sélectionner

client.ListObjectsAsync(bucketName, (request, response) => {
    /* la suite de ton code */
});