Page 1 sur 1

[Script] Ma Coroutine ne fonctionne pas

Publié : 07 Jan 2019 21:19
par syanis94
Salut les Amis,

voici mon code ci-joint, je comprend pas pourquoi ma coroutine ne fonctionne pas ?

et aussi j'ai ajouté un timer de 10 secondes avec le CurrentTime -= Time.DeltaTime dans le Update, le compte à rebort marche très bien, mais il est trop rapide, entre le 10 et le 9 et 8 et 7 ... y a pas une seconde, sa se diminue trop rapidement, les 10 secondes dure 1 secondes -_-

voici mon code sans le timer, si vous voulez le code de timer je vous le donnerais :

Code : Tout sélectionner

void Update () {

        if (GameObject.FindGameObjectsWithTag("Player").Length == 4 && Tour == 0)
        {
            for (int i = 0; i < GameObject.FindGameObjectsWithTag("Player").Length; i++)
            {

                // Le timer ici
                StartCoroutine(Wait(10F));

                if (GameObject.FindGameObjectsWithTag("Player")[i].GetComponent<PlayerControler>().Role == "Guerrier")
                    print(GameObject.FindGameObjectsWithTag("Player")[i].name);


            } // For
        } // Premieère condition de tour == 0
    }

    // Couroutine
    #region couroutine wait
    IEnumerator Wait(float waitTime)
    {
        while(Pause)
        yield return new WaitForSeconds(waitTime);

        Pause = false;
    }
    #endregion

Re: [Script] Ma Coroutine ne fonctionne pas

Publié : 07 Jan 2019 22:24
par Max
Bonsoir,

C'est toujours mieux d'avoir tous les éléments plutôt que des bribes.
Par exemple, quel est le rôle de 'Pause'. On peut penser qu'il est à true au départ (vu que dans la coroutine on y trouve un Pause=false, qui pour moi ne sera jamais exécuté), ce qui fait que ta coroutine tourne dans le vide.

Re: [Script] Ma Coroutine ne fonctionne pas

Publié : 07 Jan 2019 23:08
par syanis94
ah oui pardonne, non ce code est faut j'avais oublié de supprimé la variable pause

Code : Tout sélectionner

void Update () {

        if (GameObject.FindGameObjectsWithTag("Player").Length == 4 && Tour == 0)
        {
            for (int i = 0; i < GameObject.FindGameObjectsWithTag("Player").Length; i++)
            {

                // Le timer ici
                StartCoroutine(Wait(10F));

                if (GameObject.FindGameObjectsWithTag("Player")[i].GetComponent<PlayerControler>().Role == "Guerrier")
                    print(GameObject.FindGameObjectsWithTag("Player")[i].name);


            } // For
        } // Premieère condition de tour == 0
    }

    // Couroutine
    #region couroutine wait
    IEnumerator Wait(float waitTime)
    {

        yield return new WaitForSeconds(waitTime);

    
    }
    #endregion

Re: [Script] Ma Coroutine ne fonctionne pas

Publié : 08 Jan 2019 00:03
par Max
Je pense que tu appréhende mal le fonctionnement des coroutines.
Quand tu fais ton

Code : Tout sélectionner

                // Le timer ici
                StartCoroutine(Wait(10F));
tu passes direct à la ligne suivante (sans tempo). En //, dans son coin, tu as ta coroutine qui part pour 10 sec, puis ne fait plus rien.

Re: [Script] Ma Coroutine ne fonctionne pas

Publié : 08 Jan 2019 00:43
par syanis94
Merci beaucoup pour ta réponse Max, mais j'ai tjr pas compris ce que je dois faire ?

Re: [Script] Ma Coroutine ne fonctionne pas

Publié : 08 Jan 2019 08:38
par Max
Quand tu lance ta coroutine avec le Startcoroutine, cela ne provoque pas d'arrêt du code dans ton Update de 10 seconde, pour après continuer vers l'instruction suivante.
Il faut repenser ton approche. Déjà, retire les FindGameObjectsWithTag qui sont terriblement gourmands, dans un Update c'est vraiment pas leurs places. Récupère le tableau de GameObject dans le Start par exemple. En suite, c'est dans ta coroutine, qu'il faut inscrire l'action "timée", pas dans ton update.
Tu peux éventuellement écrire quelque chose comme ça:

Code : Tout sélectionner

    IEnumerator Wait(float waitTime)
    {
        for(...)
        {
            yield return new WaitForSeconds(waitTime);
            action;
        }
    }

Re: [Script] Ma Coroutine ne fonctionne pas

Publié : 08 Jan 2019 19:10
par syanis94
Salut Max,

Premièrement ! Merci pour votre réponse ... Pour ce qui concerne le FindGameObjectByTag je sais que sa bouffe en ressources mais j'étais obliger de faire avec, je m'explique, mon jeu est un jeu en ligne, à chaque fois un joueur se connecte dans le jeu, donc j’enclenche dans mon Update() une condition, dès que les joueurs qui ont un tague Player atteint 4.

Pour la coroutine, je peux pas mettre mon action à l'intérieur de ma coroutine parce que voilà ce que j'ai envie de faire en français :
Lorsque le nombre de mes joueurs avec tague Player atteint 4, je veux leur afficher un message la partie commence dans 10 secondes avec un timer en bas, après 10 secondes je veux changer le message et activer seulement les joueurs qui ont un rôle Guerrier, laisser le role guerrier jouer pendant 30 secondes, après le desactiver et activer un autre rôle pendant une autre durée ainsi de suite ... bien sure toute en affichant le timer (compte à rebort)


PS : Je sais c un projet un peu grand pour un débutant comme moi, mais je suis assez motivé, et je me connais pas mal en programmation, sauf le C# Et unity sa fait que 06 mois que je découvre

Et encore merci pour vos réponses <3

Re: [Script] Ma Coroutine ne fonctionne pas

Publié : 08 Jan 2019 19:47
par Max
Bonsoir,

je pense malgré tout qu'avec des coroutines bien pensées tu peux gérer la choses.
Sinon, après tu peux coder ton système de timer, il existe pas mal de solutions, tu n'auras pas de mal à en trouver et à l'adapter à tes besoins.
Un exemple simple à la volé:

Code : Tout sélectionner

    //[SerializeField]
    private float timevalue = 10.0f;	// 10 secondes
    private float curenttime = 0;


    // Update is called once per frame
    void Update()
    { 
        ...  
        curenttime += Time.deltaTime;
        if(curenttime>timevalue)
        {
            Debug.Log("Fin timer");
            curenttime = 0; // ré-init du comptage
        }
        ...
    }


Re: [Script] Ma Coroutine ne fonctionne pas

Publié : 08 Jan 2019 21:34
par syanis94
Oui pour la timer, je connais le code, le problème avec, c qu'il est trop rapide le compte à rebort, 10 secondes duree à peine 1 secondes :'(

Pour la coroutine j'ai vraiment aucune idée, je vais essayé avec une bool pour voir ce que sa donne

Re: [Script] Ma Coroutine ne fonctionne pas

Publié : 14 Jan 2019 12:34
par Sebela
Hello,

Avec une coroutine, s'il te faut pouvoir afficher le compte à rebours, il faut que tu reviennes dans ta coroutine toutes les secondes :

Code : Tout sélectionner

IEnumerator Countdown (int seconds) {
     int compteur = seconds;
     while (compteur > 0) {
         yield return new WaitForSecondsRealtime(1); // le realtime permet d'avoir une seconde réelle, sans prendre en compte un scale du temps.
         compteur --;
     }
     ActiverJoueurs();
 }