Waitforsecond

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
Ronaldonizuka
Messages : 6
Inscription : 29 Mars 2015 20:48

Waitforsecond

Message par Ronaldonizuka » 17 Avr 2015 12:52

Bonjour à tous,
J'ai un petit problème, qui je pense, vous paraîtra ne pas en être un.
Lorsque que l'on clique sur un bouton du menu, une petite animation doit se passer avant le changement de scène, oui mais voilà je n'arrive pas à utiliser le WaitForSecond, voici mon code :

Code : Tout sélectionner

public void maFonction () {
		boule = GameObject.Find("Sphere").GetComponent<Rigidbody>();
		boule.AddForce (new Vector3 (0, -80, 0));
		yield new WaitForSeconds(1)
		Application.LoadLevel ("scene1");
	}
L'erreur affiché est : error CS1525: Unexpected symbol `new' (avec un return new c une autre erreur : error CS1624: The body of `button.maFonction()' cannot be an iterator block because `void' is not an iterator interface type)
Merci d'avance pour votre aide :)

Avatar de l’utilisateur
NDrew
Messages : 581
Inscription : 25 Oct 2013 15:14
Localisation : Clermont-Ferrand

Re: Waitforsecond

Message par NDrew » 17 Avr 2015 12:57

tu retourne quelque chose dans une methode qui ne retourne rien(void)

regarde les exemple de yield et tu devrais trouver ta solution

Ronaldonizuka
Messages : 6
Inscription : 29 Mars 2015 20:48

Re: Waitforsecond

Message par Ronaldonizuka » 17 Avr 2015 13:32

Merci c'est ce que j'avais cru comprendre.
Mais dans l'exemple donné dans la doc c'est une fonction IEnumerator j'ai beau avoir cherché je ne sais pas du tout ce que c'est.
De plus je n'ai pas compris ce qu'était un yield.
Enfin dans mon petit esprit simple, faire une pause, ce n'est pas renvoyer quelque chose, ainsi donner un nouveau poid a un object, faire une pause et changer de scène, ça pouvait très bien aller dans une fonction void...
Ou est mon erreur ?
Merci d'avance.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6221
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Waitforsecond

Message par boubouk50 » 17 Avr 2015 13:42

Doc Yield
L'exemple C# te montre clairement que tu dois avoir une fonction IEnumerator avec un return sur le WaitForSecond()
Ce qui te donne:

Code : Tout sélectionner

public IEnumerator maFonction () {
      boule = GameObject.Find("Sphere").GetComponent<Rigidbody>();
      boule.AddForce (new Vector3 (0, -80, 0));
      yield return new WaitForSeconds(1)
      Application.LoadLevel ("scene1");
   }
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
NDrew
Messages : 581
Inscription : 25 Oct 2013 15:14
Localisation : Clermont-Ferrand

Re: Waitforsecond

Message par NDrew » 17 Avr 2015 13:50

ton erreur c'est que tu pense que les gens ont fait le la pause comme toi tu l'aurais fait sans comprendre comment ca marche.

En gros, quand tu yield un waitForSecond, tu dit a unity, revient ici dans X seconds. Et pour faire un yield il faut que la methode retourne un IEnumerable. tu peux regarder les exemple dans la page MSDN de yield, c'est intéressant. https://msdn.microsoft.com/fr-fr/library/9k7k7cf0.aspx

Ronaldonizuka
Messages : 6
Inscription : 29 Mars 2015 20:48

Re: Waitforsecond

Message par Ronaldonizuka » 17 Avr 2015 13:51

boubouk50 a écrit :Doc Yield
L'exemple C# te montre clairement que tu dois avoir une fonction IEnumerator avec un return sur le WaitForSecond()
Ce qui te donne:

Code : Tout sélectionner

public IEnumerator maFonction () {
      boule = GameObject.Find("Sphere").GetComponent<Rigidbody>();
      boule.AddForce (new Vector3 (0, -80, 0));
      yield return new WaitForSeconds(1)
      Application.LoadLevel ("scene1");
   }
Merci pour ta réponse,
J'avais en effet testé ça, au vu de la doc mais ça ne fonctionne toujours pas...
Voilà le message d'erreur : ArgumentException: method return type is incompatible
System.Delegate.CreateDelegate (System.Type type, System.Object firstArgument, System.Reflection.MethodInfo method, Boolean throwOnBindFailure) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System/Delegate.cs:190)
System.Delegate.CreateDelegate (System.Type type, System.Object firstArgument, System.Reflection.MethodInfo method) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System/Delegate.cs:276)
UnityEngine.Events.InvokableCall..ctor (System.Object target, System.Reflection.MethodInfo theFunction) (et ça continue...)

Avatar de l’utilisateur
giyomuSan
Messages : 1799
Inscription : 09 Déc 2009 14:52
Localisation : Japon

Re: Waitforsecond

Message par giyomuSan » 18 Avr 2015 01:45

je pense pas que cette erreur soit en relation avec la coroutine.
System.Delegate.CreateDelegate (System.Type type, System.Object firstArgument, System.Reflection.MethodInfo method, Boolean throwOnBindFailure) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System/Delegate.cs:190)

Répondre

Revenir vers « (C#) CSharp »