Barre de chargement ou autre : Unity 4.6

Questions à propos du GUI, y compris la partie script.
Avatar de l’utilisateur
freepl
Messages : 1034
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

Barre de chargement ou autre : Unity 4.6

Message par freepl » 03 Juil 2015 08:43

Bonjour

Je cherche à faire une animation pour faire patienter le chargement entre 2 scènes.
Cela peut-être une barre de chargement ou bien un sablier qui tourne.

1 Pour le sablier.
J'utilise ce script

Code : Tout sélectionner

#pragma strict
// Déclaration de la vitesse de rotation
var vitesseRotation : float = 12.0;

function Update ()
{
 transform.Rotate(Vector3(vitesseRotation * Time.deltaTime,0,0));
}

Mais comme le deltatime est nul pendant le chargement du level , cela freeze et donc cela ne fonctionne pas.
Que dois-je modifier ?


2 Pour une barre de chargement
J'utilise ( j'ai essayé plutôt) ce script

Code : Tout sélectionner

#pragma strict
var barDisplay : float = 0;

var pos : Vector2 = new Vector2(20,40); var size : Vector2 = new Vector2(60,20); var progressBarEmpty : Texture2D; var progressBarFull : Texture2D;

function OnGUI() {

// draw the background:
GUI.BeginGroup (new Rect (pos.x, pos.y, size.x, size.y));
GUI.Box (Rect (0,0, size.x, size.y),progressBarEmpty);

// draw the filled-in part:
GUI.BeginGroup (new Rect (0, 0, size.x * barDisplay, size.y));
GUI.Box (Rect (0,0, size.x, size.y),progressBarFull);
GUI.EndGroup ();

GUI.EndGroup ();

}

function Update() { 
// for this example, the bar display is linked to the current time,
 // however you would set this value based on your desired display 
 // eg, the loading progress, the player's health, or whatever. 
 barDisplay = Time.time * 0.05;
 }
a) Même résultat avec le deltaTime
b) Comment ajuster la durée du changement de couleur avec le temps de chargement de la scène suivante ?

Merci

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

Re: Barre de chargement ou autre : Unity 4.6

Message par boubouk50 » 03 Juil 2015 09:30

Tu utilises Application.LoadLevel(), je suppose?
Tu peux utiliser Application.LoadLevelAsync() pour charger ton niveau en background ou bien utiliser une coroutine pour la barre/sablier.

ProgressBar Asynchrone
"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
freepl
Messages : 1034
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

Re: Barre de chargement ou autre : Unity 4.6

Message par freepl » 03 Juil 2015 09:36

boubouk50 a écrit :Tu utilises Application.LoadLevel(), je suppose?
Tu peux utiliser Application.LoadLevelAsync() pour charger ton niveau en background ou bien utiliser une coroutine pour la barre/sablier.

ProgressBar Asynchrone
merci chef !

Avatar de l’utilisateur
freepl
Messages : 1034
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

ERREUR : Barre de chargement ou autre : Unity 4.6

Message par freepl » 03 Juil 2015 13:46

:oops: :oops: Groose erreur de ma part. :oops: :oops:

En fait ce n'est pas pendant le chargement d'un level que je veux mettre une animation de chargement mais pendant le temps d'une apparition / disparition d'éléments.
C'est une barre de "temporisation" le temps d'afficher / masquer les versions du projet.

Ma maquette a un terrain. Celui-ci ne bouge pas.
J'ai 2 routes que je masque/affiche à tour de rôle en cliquant sur un guibutton ( 1 par version de route).
Cela fonctionne sans pb.

Donc ma bonne question est :
lancer une barre de chargement qui dure le temps du masquage / affichage.

J'espère être compréhensible.

Désolé boubouk50 pour ma mauvaise explication, mais je garde quand même pour les changement de levels

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

Re: Barre de chargement ou autre : Unity 4.6

Message par boubouk50 » 03 Juil 2015 13:58

Tu fais un SetActive(true) sur une grosse partie des objets et ça prend du temps a s'afficher? Et tu veux mettre une barre de progression ou un sablier pendant l'attente de l'affichage?
Toujours la Coroutine. Tu fais l'affichage/masquage dans une coroutine. Comme ça, ce n'est pas géré par le processus principal et ça ne bloque pas l'application. Donc dans le processus principal, tu peux lancer l'animation de sablier (parce que je suis pas sur que tu puisses récupérer un pourcentage de chargement pour la progressBar) et quand la coroutine se termine, tu coupes l'animation.
"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
freepl
Messages : 1034
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

Re: Barre de chargement ou autre : Unity 4.6

Message par freepl » 03 Juil 2015 14:01

boubouk50 a écrit :Tu fais un SetActive(true) sur une grosse partie des objets et ça prend du temps a s'afficher? Et tu veux mettre une barre de progression ou un sablier pendant l'attente de l'affichage?
Exact.

Merci encore

Avatar de l’utilisateur
Titan
Messages : 582
Inscription : 12 Sep 2011 13:54
Contact :

Re: Barre de chargement ou autre : Unity 4.6

Message par Titan » 07 Juil 2015 15:54

Les coroutines SONT exécuté par le Processus principale, juste après l'appel des fonction Update et n'utilisent pas de thread: http://docs.unity3d.com/Manual/ExecutionOrder.html

Tu a Ressources.LoadAsync qui te permet de charger un objet (depuis le dossier ressource). Mais ça n'a pas l'air d'être exactement ce que tu souhaite, et rien ne va te permettre d'activer un objet de manière asynchrone. Tu peut effectivement avoir une coroutine qui active les objets un par frame, mais comme mon leader technique actuel dirait: "c'est rajouter une couche de merde pour cacher ta merde". Ton problème viens clairement d'une erreur de conception qu'on ne peut pas t'aider à résoudre sans un peu plus de contexte: C'est quoi ces objets que tu veux activer ? pourquoi il y en a autant ? pourquoi à ce moment là ?
____________________________________________
Hop Boy

Avatar de l’utilisateur
freepl
Messages : 1034
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

Re: Barre de chargement ou autre : Unity 4.6

Message par freepl » 07 Juil 2015 16:08

salut

Je fais des maquettes routières qui seront réalisées réellement, type nouvelle nationale, déviation, autoroute ...

Mon terrain est fait de dalles de 512*512, ou bien 1024*1024 m.

J'ai par exemple 2 versions d'une déviation.

Donc pour le terrain, j'ai des carés qui ne seront pas du tout impactés. Donc ceux là sont oujours affichés.
J'ai des carrés impactés par projet, c'est eux que j'affiche ou masque par un guibutton.
de la même façon donc, j'affiche ou masque par ce même guibutton, la route que je veux.

En fonction des projets je peux avoir pas mal de carrés à afficher/masquer, d'où la lenteur d'affichage.

Avatar de l’utilisateur
Titan
Messages : 582
Inscription : 12 Sep 2011 13:54
Contact :

Re: Barre de chargement ou autre : Unity 4.6

Message par Titan » 07 Juil 2015 18:00

Ton probléme est bizarre, SetActive ne devrait normalement pas créer de ralentissement.

Les dalles utilisent les terrain d'unity ou ce sont des mesh ? Tu a des colliders dans ta scene ? Ça rame uniquement la première fois que tu l'active ou ça le fait à chaque réactivation ? Tu a des script qui font des traitements dans Start() ou OnEnable() ?

Utilise le profiler pour trouver l'origine, tu va forcément pouvoir supprimer ton freeze.

edit:
J'ai fait des recherches et effectivement il semble qu'il existe un problème: ce thread en parle et propose une solution particulièrement moche mais les commentaires apporte une piste intéréssente.
il existe Mesh.UploadMeshData qui semble utile pour les mesh procéduraux et Shader.WarmupAllShaders qui semble plus prometteur.
Du coup, une question supplémentaire: Tu a combien de drawcall dans ta scène en général ? combien de shader distinct ?
____________________________________________
Hop Boy

Avatar de l’utilisateur
freepl
Messages : 1034
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

Re: Barre de chargement ou autre : Unity 4.6

Message par freepl » 15 Juil 2015 09:22

Bonjour

"Les dalles utilisent les terrain d'unity ou ce sont des mesh ?"
Ce sont des meshs sauf celles proches du projet où je les convertie en terrain unity pour placer de la végétation.

" Tu a des colliders dans ta scene ?"
Toutes mes dalles ont un mesh collider car j'utilise un système pour mesurer des distances qui nécessite un collider


" Ça rame uniquement la première fois que tu l'active ou ça le fait à chaque réactivation ?"
C'est en permanence

" Tu a des script qui font des traitements dans Start() ou OnEnable() ? "
Dans Start

"Utilise le profiler pour trouver l'origine, tu va forcément pouvoir supprimer ton freeze."
voici des copies d'écran du Profiler. Je ne connais pas son utilisation et comment utiliser ses résultats.
Image

Image

Image


Sur un forum on parle de aliasing pour les textures.
Comment utiliser cet "outil" sur mes textures ?
J'ai cru comprendre qu'en fonction de la distance, la texture passait par exemple de 512 dpi en 256 dpi et doncmeilleur fps .

Dans ma maquette, j'ai une texture chaussée, accotement, herbe et les textures de mes dalles qui sont TOUTES en 1024*1024.
donc si j'ai 200 dalles, j'ai en permanence ces 200 x ( 1024*1024) en mémoire :oops:

Répondre

Revenir vers « L'interface GUI »