Shirown a écrit :C'est à dire que dans ton algo, c'est une coroutine qui lance une boucle while, la coroutine est lancé une fois. Donc les contrôle de type StopCoroutine ou StopAllCoroutines ne fonctionneront pas.
Euh non pas du tout, une coroutine peut être arrêté dès quelle rencontre un yield return.
En fait, si on veut vraiment comprendre comment ça marche, une coroutine est stoppé dès qu'elle rencontre un yield return, et le mécanisme qui gère les coroutines peut la reprendre quand il veut (voir les classes IEnumerable et IEnumerator).
Shirown a écrit :Ensuite dans mon algo, la method qui refresh peut servir à d'autres choses au moment où la coroutine doit être relancé. Certains contrôles peuvent être fait à ce niveau qui n'ont peut être même rien à voir avec le refresh de la coroutine. Mais un Check quotidien (ou que sais-je) qui doit être fait en plus, avant ou après, le rafraîchissement de la coroutine.
On peut très bien faire les contrôles à l'intérieur de la coroutine (ou en appelant une fonction depuis la coroutine, ce qui revient au même).
Shirown a écrit :Code : Tout sélectionner
//Method qui lance la coroutine (ici en exemple, Start)
void Start()
{
StartCoroutine("Testing");
}
//Coroutine
IEnumerator Testing()
{
//actions dans ta coroutine (faisant office d' Update)
//(exemple ici comptage des frames)
Debug.Log(Time.frameCount);
yield return null;
RepeatTesting();
}
//Method qui répète la coroutine
void RepeatTesting()
{
StartCoroutine("Testing");
}
Dans ton code la coroutine sert pas à grand chose vu qu'elle n'exécute rien sur plusieurs frames. Autant appeler la fonction Testing (sans qu'elle soit en coroutine) depuis un Update : plus propre, même résultat, pas d'IEnumerable et IEnumerator alloués.
Pour revenir au premier post :
Somoraze a écrit :je n'ai pas bien compris comment utiliser les coroutines pour répéter un code, apparemment il vaut mieux utiliser une coroutine plutôt que l'update: donc j'ai un objet que je fais rebondir doucement en modifiant la valeur du sinus, ça marche bien dans l'update, j'essaie de le mettre dans cette fonction mais il est appelé qu'une fois: sauriez-vous quel est le problème avec InvokeRepeating? Ou quelle est la bonne manière de répéter le code dans la fonction?
Code : Tout sélectionner
IEnumerator startSin() {
if ( multSin < 0.1f ) {
//...
}// < 0.1f
else if ( multSin > 0 ){
//...
}// > 0f
InvokeRepeating("startSin", 0, Time.deltaTime );
yield return null;
}//#IEnumerator
Merci
Pourquoi se compliquer la vie ? Un code comme ça a plus ça place dans un Update (en tout cas pour moi). De plus on utilise les coroutines dans le but de répartir une fonction sur plusieurs frames avec yield return, mais le mettre à la fin n'a aucun sens.
InvokeRepeating sert à appeler une fonction (normale, pas coroutine) à intervalles (à peu près) réguliers.
Si tu veux quand même faire du mouvement en coroutine, regarde le deuxième code de cayou, c'est le plus propre (et de loin
).