[Script] Ma Coroutine ne fonctionne pas

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Répondre
syanis94
Messages : 23
Inscription : 11 Nov 2018 16:23

[Script] Ma Coroutine ne fonctionne pas

Message par syanis94 » 07 Jan 2019 21:19

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

Avatar de l’utilisateur
Max
Newser
Newser
Messages : 7444
Inscription : 30 Juil 2011 13:57

Re: [Script] Ma Coroutine ne fonctionne pas

Message par Max » 07 Jan 2019 22:24

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.
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

syanis94
Messages : 23
Inscription : 11 Nov 2018 16:23

Re: [Script] Ma Coroutine ne fonctionne pas

Message par syanis94 » 07 Jan 2019 23:08

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

Avatar de l’utilisateur
Max
Newser
Newser
Messages : 7444
Inscription : 30 Juil 2011 13:57

Re: [Script] Ma Coroutine ne fonctionne pas

Message par Max » 08 Jan 2019 00:03

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.
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

syanis94
Messages : 23
Inscription : 11 Nov 2018 16:23

Re: [Script] Ma Coroutine ne fonctionne pas

Message par syanis94 » 08 Jan 2019 00:43

Merci beaucoup pour ta réponse Max, mais j'ai tjr pas compris ce que je dois faire ?

Avatar de l’utilisateur
Max
Newser
Newser
Messages : 7444
Inscription : 30 Juil 2011 13:57

Re: [Script] Ma Coroutine ne fonctionne pas

Message par Max » 08 Jan 2019 08:38

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;
        }
    }
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

syanis94
Messages : 23
Inscription : 11 Nov 2018 16:23

Re: [Script] Ma Coroutine ne fonctionne pas

Message par syanis94 » 08 Jan 2019 19:10

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

Avatar de l’utilisateur
Max
Newser
Newser
Messages : 7444
Inscription : 30 Juil 2011 13:57

Re: [Script] Ma Coroutine ne fonctionne pas

Message par Max » 08 Jan 2019 19:47

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
        }
        ...
    }

Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

syanis94
Messages : 23
Inscription : 11 Nov 2018 16:23

Re: [Script] Ma Coroutine ne fonctionne pas

Message par syanis94 » 08 Jan 2019 21:34

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

Avatar de l’utilisateur
Sebela
Messages : 139
Inscription : 25 Juin 2014 21:39

Re: [Script] Ma Coroutine ne fonctionne pas

Message par Sebela » 14 Jan 2019 12:34

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();
 }

Répondre

Revenir vers « Scripting Javascript, C# et Boo »