Attendre quelques secondes dans une méthode static

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
kosted
Messages : 258
Inscription : 20 Avr 2015 18:21

Attendre quelques secondes dans une méthode static

Message par kosted » 26 Jan 2016 16:55

Bonjour,
quelqu'un sait comment faire pour appeler le

Code : Tout sélectionner

yield return new WaitForSeconds(5)
dans une méthode static ?
Merci d'avance

Avatar de l’utilisateur
Freelax
Messages : 1595
Inscription : 30 Déc 2009 23:02
Localisation : Niort
Contact :

Re: Attendre quelques secondes dans une méthode static

Message par Freelax » 26 Jan 2016 19:46

yield return new WaitForSeconds(5)
S'utilise uniquement dans une coroutine qui peut tres bien etre static. Je comprends pas trop ton souci ... :?
Image

kosted
Messages : 258
Inscription : 20 Avr 2015 18:21

Re: Attendre quelques secondes dans une méthode static

Message par kosted » 26 Jan 2016 21:50

Je comprends pas trop ton souci...
Ce n'est pas possible dans Unity de faire ça. J'ai essayé, l'outil gueule et j'ai vérifié sur des forums et certains ont eu ce soucis.
Le problème que j'ai eu à la base et pour lequel j'ai pensé à faire un wait est ici, si tu vois un lien ou une solution...
viewtopic.php?f=7&t=11825

kosted
Messages : 258
Inscription : 20 Avr 2015 18:21

Re: Attendre quelques secondes dans une méthode static

Message par kosted » 26 Jan 2016 22:01

Euh, je n'ai rien dit :-D . On peut bien utiliser le

Code : Tout sélectionner

yield return new WaitForSeconds(5)
en faisant appel au StartCoroutine. Mais le problème reste le même pour moi (voir lien ci-haut), je n'attends pas les 5 secondes dans ma méthode static. Dans mon code, je suis passé plusieurs fois dans ma boucle et tout s'est même moment sans attendre les 5 seconde à chaque fois.

Code : Tout sélectionner

                //distribution 

                //Récupération du prochain trou
                goProchainTrou = getProchainTrou(goTrouCourant);
                tabCoord = TraitementsPartages.getCoordByGameObject(goProchainTrou, "humain"); //coord prochain trou
                
                //Incrémentation du prochain trou
                unTrou = goProchainTrou.GetComponent<UnTrou>();
                int newNbPion = unTrou.nbPion+1;
                TraitementsPartages.setNbetLabelPion(tabCoord[0], tabCoord[1], newNbPion, "humain");

                // on enlève un pion au trou courant et on rajoute un pion au prochain trou
                GameObject pion = goTrouOrigineTouche.GetComponent<UnTrou>().RemoveFirst();
                //On demande au trou suivant de donner une nouvelle position à ce nouveau pion
                Vector2 nouvellePositionPion = goProchainTrou.GetComponent<UnTrou>().getRandomPointForPawn();
                GameObject positionNouvelle = GameObject.Find("ObjetTemporaire");
                positionNouvelle.transform.localPosition = nouvellePositionPion;
                TraitementsPartages.AnimationPion(pion, UnTrou.GoTrouDetecteApresClick, positionNouvelle);
                //iTween.MoveBy(pion, iTween.Hash("x", goProchainTrou.GetComponent<UnTrou>().getRandomPointForPawn(), "time", 0.5, "oncomplete", "EndHorizontalMove"));
                goProchainTrou.GetComponent<UnTrou>().listePion.Add(pion); //le nombre de pion de ce trou augmente
                StartCoroutine(Example()); //On est censé attendre 5 seconde, mais nada


                goTrouCourant = goProchainTrou;
                nbPionTrouOrigine--;
                
            }

Avatar de l’utilisateur
Freelax
Messages : 1595
Inscription : 30 Déc 2009 23:02
Localisation : Niort
Contact :

Re: Attendre quelques secondes dans une méthode static

Message par Freelax » 26 Jan 2016 22:05

//On est censé attendre 5 seconde, mais nada
Normal, le lancement de la coroutine ne lock pas le reste de cette fonction sauf si elle est elle même appelé dans une coroutine et dans ce cas tu yield le StartCoroutine. Il faut que la suite de cette fonction soit appelée 5 secondes plus tard. Donc ces lignes doivent être dans la coroutine elle même et après ton delay.

Montre un peu plus de code, parque la, un bout de fonction sortie du contexte, ça aide pas des masses ^^
Image

kosted
Messages : 258
Inscription : 20 Avr 2015 18:21

Re: Attendre quelques secondes dans une méthode static

Message par kosted » 26 Jan 2016 22:19

J'ai vraiment du mal avec cette histoire de coroutine. Voilà tout le code et le problème que j'ai.
Dans un trou 1, j'ai par exemple 4 pions et quand je clique sur le trou 1, je veux déplacer chaque pion dans les trois trous suivants (trou 2, 3 et 4). Le dernier pion je le place dans le trou 6. Ca j'y arrive.

Pour déplacer mes pions je fais un déplacement en utilisation itween et en lui donnant 3 coordonnées. celle du trou de début, une au milieu et celle de fin. Et quand le pion se déplace. ca donne un effet 3d.

Le problème est que TOUS LES PIONS SE DEPLACEMENT EN MEME TEMPS....et c'est moche
code de la boucle et du changement de pion par trou

Code : Tout sélectionner

 public void JouerUnTour()
    {
        GameObject goTrouCourant = UnTrou.GoTrouDetecteApresClick; //Initialisation d'une variable locale
        GameObject goTrouOrigineTouche = goTrouCourant; //Cette variable permet de toujours savoir d'où on est parti. Sert aussi dans le cas du monde ndiri nda mo
        GameObject goProchainTrou;
        UnTrou unTrou;
        int[] tabCoord;

        
        //Test du nombre de pion
        int nbPionTrouOrigine = goTrouCourant.GetComponent<UnTrou>().nbPion; //nombre de pion de ce trou
        if(nbPionTrouOrigine <= 1)
        {
            //TODO : Afficher un message comme quoi on ne peut pas déplacer avec 0 ou 1 pion
            
        }
        else
        {
            //On met le trou à zéro
            //Récupération des cooord du trou courant
           tabCoord = TraitementsPartages.getCoordByGameObject(goTrouCourant, "humain");
           TraitementsPartages.setNbetLabelPion(tabCoord[0],tabCoord[1],0,"humain");

            while (nbPionTrouOrigine > 1)
            {
                //distribution 

                //Récupération du prochain trou
                goProchainTrou = getProchainTrou(goTrouCourant);
                tabCoord = TraitementsPartages.getCoordByGameObject(goProchainTrou, "humain"); //coord prochain trou
                
                //Incrémentation du prochain trou
                unTrou = goProchainTrou.GetComponent<UnTrou>();
                int newNbPion = unTrou.nbPion+1;
                TraitementsPartages.setNbetLabelPion(tabCoord[0], tabCoord[1], newNbPion, "humain");

                // on enlève un pion au trou courant et on rajoute un pion au prochain trou
                GameObject pion = goTrouOrigineTouche.GetComponent<UnTrou>().RemoveFirst();
                //On demande au trou suivant de donner une nouvelle position à ce nouveau pion
                Vector2 nouvellePositionPion = goProchainTrou.GetComponent<UnTrou>().getRandomPointForPawn();
                GameObject positionNouvelle = GameObject.Find("ObjetTemporaire");
                positionNouvelle.transform.localPosition = nouvellePositionPion;
                TraitementsPartages.AnimationPion(pion, UnTrou.GoTrouDetecteApresClick, positionNouvelle);
                //iTween.MoveBy(pion, iTween.Hash("x", goProchainTrou.GetComponent<UnTrou>().getRandomPointForPawn(), "time", 0.5, "oncomplete", "EndHorizontalMove"));
                goProchainTrou.GetComponent<UnTrou>().listePion.Add(pion); //le nombre de pion de ce trou augmente
                StartCoroutine(Example());


                goTrouCourant = goProchainTrou;
                nbPionTrouOrigine--;
                
            }
code de l'animation du déplacement

Code : Tout sélectionner

    public static void AnimationPion(GameObject pion, GameObject trouInitial, GameObject destination)
    {
        ppion = pion;
        prochainTrou = destination;
        Vector3[] path = new Vector3[2];
        Vector3 pivot = getPositionPivot(trouInitial, destination);
   
        Hashtable h = new Hashtable();

        path[0] = pivot;
        path[1] = destination.transform.position;

        //il faudra passer le game object en paramètre
        h.Add("path", path); //tableau avec les différents pour pour le déplacement du pion
        h.Add("time", 2); //durée de l'animation
        h.Add("onstart", "DeplacementOmbre"); //On fait déplacer une ombre en même temps pour donner un effet de déplacement dans l'espace
        h.Add("trasition", "easeInCirc");

        //path[3] = new Vector3(0, 0, 0);
        iTween.MoveTo(pion, h); //if you do not want the object to animate to the first point on the path add */
                                //CoroutineUtil.WaitForRealSeconds(5);
       



        //iTween.Stab();
    }
J'ai donc pensé à rajouter un temps d'attente à la fin de chaque itWeenMoveTo, pour bloquer l'animation et déplacement du prochain pion

kosted
Messages : 258
Inscription : 20 Avr 2015 18:21

Re: Attendre quelques secondes dans une méthode static

Message par kosted » 26 Jan 2016 23:34

Freelax a écrit :
//On est censé attendre 5 seconde, mais nada
Normal, le lancement de la coroutine ne lock pas le reste de cette fonction sauf si elle est elle même appelé dans une coroutine et dans ce cas tu yield le StartCoroutine. Donc ces lignes doivent être dans la coroutine elle même et après ton delay.
Après des tests, j'ai compris ce que tu voulais dire. J'ai donc déclaré ma méthode

Code : Tout sélectionner

public IEnumerator jouerUnTour()
, et là où je l'utilisais (dans le update), j'ai fais StartCoroutine(jouerUnTour()) mais visual studio me dis

Code : Tout sélectionner

Les chemins de code ne retournent pas tous une valeur

kosted
Messages : 258
Inscription : 20 Avr 2015 18:21

Re: Attendre quelques secondes dans une méthode static

Message par kosted » 26 Jan 2016 23:56

Tout fonctionne comme je le voulais. Merci pour cette idée de coroutine.

Répondre

Revenir vers « (C#) CSharp »