[DB - AL] boucle while

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
Hellocephantom
Messages : 28
Inscription : 08 Avr 2020 10:02

[DB - AL] boucle while

Message par Hellocephantom » 11 Mai 2020 11:15

Bonjour à tous !

J'ai un petit problème avec les boucles while :

Code : Tout sélectionner

public class test : MonoBehaviour
{

    public bool variable;


    void Update()
    {
        while (variable)
            print("ça marche");
    }
}
Quand je lance ce programme et que je passe "variable" à true, Unity ne fonctionne plus...
Je ne comprends pas où pourrais être mon erreur.

Merci !

Avatar de l’utilisateur
Max
Messages : 8772
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB - AL] boucle while

Message par Max » 11 Mai 2020 11:26

Bonjour,

tout a fait normal. Tu te trouve dans la situation d'une boucle infinie. Et surtout dans Update() ça bloque Unity.
C'est une des règles fondamentale: les While dans les Updates sont à proscrire.
Update est appelé lors de chaque frame. Si ton application tourne par exemple à 60 fps, alors cette fonction va être appelée 60 fois par seconde. Et surtout pour schématiser, l'appli ne passera pas à la frame suivante tant qu'il n'y a pas eu d'exit sur tous les Updates. Donc ta boucle infini bloque l'Update, d’où le blocage d'Untiy.

Il faut bien avoir en tête les grands principes de fonctionnement d'unity et surtout le rôle de chaque callbacks/messages de la classe MonoBehaviour.

PS: utilise les balises code lorsque tu postes un script. Merci.
Image
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

Hellocephantom
Messages : 28
Inscription : 08 Avr 2020 10:02

Re: [DB - AL] boucle while

Message par Hellocephantom » 11 Mai 2020 13:44

D'accord merci pour toutes ces précisions !

Alors comment puis-je remplacer le while ?

Merci !

Avatar de l’utilisateur
jmhoubre
Messages : 858
Inscription : 05 Oct 2019 22:05

Re: [DB - AL] boucle while

Message par jmhoubre » 11 Mai 2020 13:55

Bonjour,

il y a plusieurs type de boucles (for, foreach, while, do while), mais le problème ne vient pas du while, mais du fait que tu crées une boucle infinie :
1) tu crées la variable "variable" : par défaut, elle est à false.
2) quelque part (???), tu la passes à true.
3) while (true) est une boucle infinie.

Que veux-tu faire en fait ?

Hellocephantom
Messages : 28
Inscription : 08 Avr 2020 10:02

Re: [DB - AL] boucle while

Message par Hellocephantom » 11 Mai 2020 14:30

En fait j'ai un autre programme ou je voudrais utiliser while. Mais dans ce programme j'avais un IEnumerator avec un "yield return new WaitfForSeconds".
Donc la boucle while ne créait pas une boucle infinie si ?
Je pense que je n'ai pas compris comment faire pour faire attendre Unity quelques secondes.

Merci !

Avatar de l’utilisateur
Max
Messages : 8772
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB - AL] boucle while

Message par Max » 11 Mai 2020 14:34

Hellocephantom a écrit :
11 Mai 2020 14:30
Je pense que je n'ai pas compris comment faire pour faire attendre Unity quelques secondes.
Sois plus précis.
Tu cherches à générer une attente au niveau d'une action ? dans ce cas regarde du coté de WaitForSeconds.
Ou cherches-tu à mettre le jeu en "pause" ? Dans ce cas regarde éventuellement du coté de Time.timeScale.
Image
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

Hellocephantom
Messages : 28
Inscription : 08 Avr 2020 10:02

Re: [DB - AL] boucle while

Message par Hellocephantom » 11 Mai 2020 16:10

Bon alors voilà :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class test : MonoBehaviour
{

    bool variable = true;


    void Start()
    {
        
    }


    void Update()
    {
        if (variable)
        {
            print("ça marche");
            Wait();
        }
    }


    IEnumerator Wait()
    {
        yield return new WaitForSeconds(1);
    }
}


Le message "ça marche" s'affiche bien mais le programme n'attend pas 1 seconde avant de de nouveau afficher le message. Pourquoi ?

Merci !

Avatar de l’utilisateur
Max
Messages : 8772
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB - AL] boucle while

Message par Max » 11 Mai 2020 16:20

Tu ne regardes pas l'exemple de la doc visiblement.
Si tu veux appeler "Wait", il faut passer par les coroutines.
Après, je ne comprend pas ton code. Tu affiches ton message tant que "variable" est à true, mais "variable" ne change jamais. Et du coup, je ne comprend pas à quoi sert "Wait" ? A attendre 1 sec, mais pour faire quoi ?

Si ton objectif est d'afficher un message pendant une durée donnée (ou exécuter toute autre action), alors tu peux passer par ce genre de coroutine:
(appel par instruction de type StartCoroutine(Tempo(1.0f));)

Code : Tout sélectionner

    public IEnumerator Tempo(float t)
    {
        float duration = Time.time + t;
        while (Time.time < duration)
        {
            Debug.Log("Message");
            yield return null;
        }
    }
:!: PS: DEUXIÈME RAPPEL pour les balises code. SVP poste tes scripts avec les balises :!:
Image
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

Avatar de l’utilisateur
jmhoubre
Messages : 858
Inscription : 05 Oct 2019 22:05

Re: [DB - AL] boucle while

Message par jmhoubre » 11 Mai 2020 20:19

Une coroutine s'appelle avec StartCoroutine (nom_coroutine ())

Code : Tout sélectionner

using System.Collections;
using UnityEngine;

public class test : MonoBehaviour {
    bool variable = true;

    void Update () {
        if (variable) {
            print ("ça marche");
            StartCoroutine (Wait());
        }
    }

    IEnumerator Wait()  {
        yield return new WaitForSeconds(1);
    }
}

Répondre

Revenir vers « (C#) CSharp »