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

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
julleg15
Messages : 9
Inscription : 03 Août 2015 12:01

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

Message par julleg15 » 19 Août 2015 12:37

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 ?
Dernière édition par julleg15 le 19 Août 2015 22:06, édité 3 fois.

sotec
Messages : 543
Inscription : 21 Sep 2012 10:11

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

Message par sotec » 19 Août 2015 12:47

ton problème est que les coroutines gettemplates() , Initialize() et LoadLevel () se lancent en même temps ?
┬─┬ノ(º - ºノ) - (╯°□°)╯︵ ┻━┻

julleg15
Messages : 9
Inscription : 03 Août 2015 12:01

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

Message par julleg15 » 19 Août 2015 12:52

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 ?

julleg15
Messages : 9
Inscription : 03 Août 2015 12:01

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

Message par julleg15 » 19 Août 2015 14:07

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:

julleg15
Messages : 9
Inscription : 03 Août 2015 12:01

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

Message par julleg15 » 19 Août 2015 22:04

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.

sotec
Messages : 543
Inscription : 21 Sep 2012 10:11

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

Message par sotec » 20 Août 2015 08:46

c'est étrange, car les yield return Coroutine(); fonctionnent très bien chez moi :/
┬─┬ノ(º - ºノ) - (╯°□°)╯︵ ┻━┻

julleg15
Messages : 9
Inscription : 03 Août 2015 12:01

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

Message par julleg15 » 20 Août 2015 17:57

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.

Avatar de l’utilisateur
artemisart
Messages : 1893
Inscription : 21 Juin 2011 19:51
Localisation : Centre
Contact :

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

Message par artemisart » 21 Août 2015 11:53

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 */
});

Répondre

Revenir vers « (C#) CSharp »