AsyncOperation pogress retourne tout le temps 0

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

AsyncOperation pogress retourne tout le temps 0

Message par kosted » 26 Déc 2015 22:58

Bonjour,
Je suis entrain de réaliser une scène de transition qui permet de avant de passer au menu d'avoir une scène qui montrer le chargement du menu. Tout marche bien, cependant, la méthode qui permet de récupérer le pourcentage de chargement me retourne tout le temps 0, alors que cette methode devait s'incrémenter de 0 jusqu'à 1. Quelqu'un sait comment je pourrais corriger cela ?

Code : Tout sélectionner

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class LevelLoader : MonoBehaviour {

	public GameObject LoadingScene;
    public Image LoadingBar;
    public Text textPourcentage; //The text with the percentage increasing
  
    public void LoadLevel (string nomScene) //The name of the scene
	{
        
        StartCoroutine (LevelCoroutine (nomScene));
	}

   
	IEnumerator LevelCoroutine (System.String nomScene)
	{
		LoadingScene.SetActive (true);
        
		AsyncOperation async = SceneManager.LoadSceneAsync(nomScene);
 

        while (!async.isDone) {
            LoadingBar.fillAmount = async.progress ; //j'ai tout le temps 0 ici
            Debug.Log(async.progress);
            textPourcentage.text = LoadingBar.fillAmount + "%"; //I have always 0% because he fillAmount is always 0
              yield return null;

		}
	}
}

Avatar de l’utilisateur
simonj
Messages : 293
Inscription : 29 Nov 2015 20:47
Localisation : Lyon

Re: AsyncOperation pogress retourne tout le temps 0

Message par simonj » 27 Déc 2015 01:09

J'ai bien vu ton post sur le forum officiel, mais le problème c'est que c'est pas exactement le même code que le tutoriel, parce que tu utilises le nouveau système avec le SceneManager. Donc je te conseillerais de ne pas utiliser la boucle while pour voir si ça change quelque chose. Sinon je pense que c'est directement dans le SceneManager, il y a peut être une conversion foireuse int ce qui perd la décimale. Mais tout cela reste au conditionnel !

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

Re: AsyncOperation pogress retourne tout le temps 0

Message par kosted » 27 Déc 2015 01:20

simonj a écrit :J'ai bien vu ton post sur le forum officiel, mais le problème c'est que c'est pas exactement le même code que le tutoriel, parce que tu utilises le nouveau système avec le SceneManager. Donc je te conseillerais de ne pas utiliser la boucle while pour voir si ça change quelque chose. Sinon je pense que c'est directement dans le SceneManager, il y a peut être une conversion foireuse int ce qui perd la décimale. Mais tout cela reste au conditionnel !

Heureusement qu'en est revenu en français :-D car je ne comprenais pas très bien, pourquoi tu voulais que je vires la boucle. Alors j'ai essayé de viré la boucle, sans succès. Au lieu de retourner null j'ai retourné async, ça n'a rien changé.

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

Re: AsyncOperation pogress retourne tout le temps 0

Message par boubouk50 » 29 Déc 2015 12:25

On peut avoir le code de la fonction SceneManager.LoadSceneAsync(nomScene) stp?
De toute évidence, c'est lui qui ne renvoie pas ce qu'il faut.
Le fait de renvoyer une valeur renvoyée pourrait être la cause également.
"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
simonj
Messages : 293
Inscription : 29 Nov 2015 20:47
Localisation : Lyon

Re: AsyncOperation pogress retourne tout le temps 0

Message par simonj » 29 Déc 2015 14:24

Le SceneManager.LoadSceneAsync est une fonction de l'API de Unity.

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

Re: AsyncOperation pogress retourne tout le temps 0

Message par kosted » 29 Déc 2015 14:49

J'ai réussi à faire fonctionner le code, la méthode qui permet de charger en asynchrone doit juste être mise dans un update ou une fonction start.
Cependant, je fais face à un autre souci, le progress arrive à 90% (0.9) freeze quelques secondes puis lance le menu. Quelqu'un sait d'où ca vient ?

Voici le nouveau code

Code : Tout sélectionner

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System;

public class LoadLevel : MonoBehaviour {

    public GameObject LoadingScene;
    public Image LoadingBar;
    public Text textPourcentage; //The text with the percentage increasing
    private String nomScene;
    private Boolean estActive = false;

    public void ChargementScene(String nom)
    {
        nomScene = nom;
        estActive = true;
    }

    void Update()
    {
        if (estActive)
        {
            StartCoroutine(LevelCoroutine(nomScene));

        }
    }

    IEnumerator LevelCoroutine(System.String nomScene)
    {
        
        LoadingScene.SetActive (true);        
		AsyncOperation async = SceneManager.LoadSceneAsync(nomScene);
       

        
        while (!async.isDone) {

            LoadingBar.fillAmount = async.progress/0.9f;                
            textPourcentage.text = LoadingBar.fillAmount*100 + "%"; //I have always 0% because he fillAmount is always 0
            val = async.progress;           
         

            yield return null;

		}

   

    }
}

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

Re: AsyncOperation pogress retourne tout le temps 0

Message par boubouk50 » 30 Déc 2015 12:30

kosted a écrit :Cependant, je fais face à un autre souci, le progress arrive à 90% (0.9) freeze quelques secondes puis lance le menu. Quelqu'un sait d'où ca vient ?
J'ai tjs eu ce souci. J'ai pas exploré plus loin.

@SimonJ: merci, je ne connaissais pas, je passais toujours par Application.LoadLevelAsync () (et je vois que c'est obsolète maintenant du coup)
"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
Skelnox
Messages : 92
Inscription : 23 Déc 2015 10:03
Localisation : Avec la grande Faucheuse
Contact :

Re: AsyncOperation pogress retourne tout le temps 0

Message par Skelnox » 30 Déc 2015 19:52

Note : I don't know where come from the function dontdestroynOnLoad, and others scenes not loaded in the picture. But when I remove allowSceneActivation, I saw in the hieracrchie these scenes not loaded, but there are cleared automatically after the loading. But when i bring back the allowSceneActivation, there are not destroyed
La flemme de répondre en Anglais sur l'autre sujet que tu as créer, plus simple ici.

Tu utilise async.allowSceneActivation = false; et attend le résultat dans while (!async.isDone) {.... Le problème c'est que il reste bloqué ici étant donné qu'il ne dépasse pas les 0.9f. Donc la deuxieme partie de ta condition où tu repasse AllowSceneActivation à True n'est jamais trouvé. Donc bonjour le bordel dans la Hierarchie.

J'ai fais la connerie en partant chercher à boire, j'ai pleurer à mon retour Unity m'a claqué dans les mains. J'avais plus d'un millier de scène dans la Hierarchie.

Ce problème de blocage, à part un bug dans l'api en elle même j'ai du mal à voir. J'ai essayé avec une scène surchargé, une autre avec rien dedans (pour tester les limites opposés) mais rien ne change et le 0.9f reste le maximum.

Je suis planté au même point que toi. Si je trouve de nouvelles infos je passerais le message, dès fois que on ne sait jamais ^^.

Edit : D'ailleurs cette histoire de 0.9f ça ne date pas d'Unity 5 (http://forum.unity3d.com/threads/using- ... st-1224051 2013 et d'autres sujet de 2012) ^^ Sinon faire sa propre fonction en considérant 0.9f comme si c'était le 1.0. Mais bon, pas très propre...
Lorsque ta vue veut pénétrer trop loin dans les ténèbres, il advient qu'en imaginant tu t'égares

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

Re: AsyncOperation pogress retourne tout le temps 0

Message par kosted » 31 Déc 2015 01:54

Skelnox a écrit :
Note : I don't know where come from the function dontdestroynOnLoad, and others scenes not loaded in the picture. But when I remove allowSceneActivation, I saw in the hieracrchie these scenes not loaded, but there are cleared automatically after the loading. But when i bring back the allowSceneActivation, there are not destroyed
La flemme de répondre en Anglais sur l'autre sujet que tu as créer, plus simple ici.

Tu utilise async.allowSceneActivation = false; et attend le résultat dans while (!async.isDone) {.... Le problème c'est que il reste bloqué ici étant donné qu'il ne dépasse pas les 0.9f. Donc la deuxieme partie de ta condition où tu repasse AllowSceneActivation à True n'est jamais trouvé. Donc bonjour le bordel dans la Hierarchie.

J'ai fais la connerie en partant chercher à boire, j'ai pleurer à mon retour Unity m'a claqué dans les mains. J'avais plus d'un millier de scène dans la Hierarchie.

Ce problème de blocage, à part un bug dans l'api en elle même j'ai du mal à voir. J'ai essayé avec une scène surchargé, une autre avec rien dedans (pour tester les limites opposés) mais rien ne change et le 0.9f reste le maximum.

Je suis planté au même point que toi. Si je trouve de nouvelles infos je passerais le message, dès fois que on ne sait jamais ^^.

Edit : D'ailleurs cette histoire de 0.9f ça ne date pas d'Unity 5 (http://forum.unity3d.com/threads/using- ... st-1224051 2013 et d'autres sujet de 2012) ^^ Sinon faire sa propre fonction en considérant 0.9f comme si c'était le 1.0. Mais bon, pas très propre...

Je rentre bien dans le else car la condition du if est strictement inférieur à 0.9, donc quand j’atteins 0.9, bah je rentre dans le else et je mets le allowActivation à true. Cependant j'ai remarqué que le async.isDone est tout le temps à false. Cela pourrait provenir là...

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

Re: AsyncOperation pogress retourne tout le temps 0

Message par kosted » 03 Jan 2016 23:53

Finalement après des jours de prise de tête tout fonctionne correctement. Voici le code pour ceux qui passeront là un jour.

Code : Tout sélectionner

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System;

public class LoadLevel : MonoBehaviour {

    public GameObject LoadingScene; //Scene noire
    public Image LoadingBar; //Bar qui montre la progression du téléchargmement
    public Text textPourcentage; //The text with the percentage increasing
    private Boolean estActive = false; //Par déafut est à false. On le passe à true quand on clique sur le bitton back pour pouvoir entrer dans la méthode du update
    AsyncOperation async = null; //variable globale qui permet de récupérer le retour de la méthode asynchrone

    /**
    Méthode qui permet de au clic de la souris de passer le booléen à true et d'activer le téléchargement asynchrone
    **/
    public void ChargementScene(String nom)
    {
        estActive = true;
        LoadingScene.SetActive(true);
        async = SceneManager.LoadSceneAsync(nom);
        async.allowSceneActivation = false; //  On demande à unity d'attendre et de ne pas activer automatiquement la scène.
    }

    void Update()
    {
        //Quand estActive est à true (après le clic du button back), on fait appel au StartCoroutine
        if (estActive)
        {
            StartCoroutine(LevelCoroutine());

        }
    }


    /**
    Méthode qui permet de charger la scène jusqu'à ce que tout soit prêt puis activé
    **/
    IEnumerator LevelCoroutine()
    {

        float pourcentage = 0;
        while (!async.isDone) {
            if (async.progress < 0.9f)
            {
                LoadingBar.fillAmount = async.progress / 0.9f;   
                pourcentage = async.progress * 100;
                textPourcentage.text = (int)pourcentage + "%"; 
            }
            else
            {
                LoadingBar.fillAmount = async.progress / 0.9f;    
                pourcentage = (async.progress/0.9f) * 100;
                textPourcentage.text = (int)pourcentage + "%";
                async.allowSceneActivation = true;
            }

            yield return null;
        }

       
        yield return async;

    }

}

Répondre

Revenir vers « (C#) CSharp »