[MY-AL][RESOLU]CrossFadeAlpha qui fade pas et WaitForSeconds qui pete

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
Vinchont
Messages : 62
Inscription : 18 Sep 2014 14:48

[MY-AL][RESOLU]CrossFadeAlpha qui fade pas et WaitForSeconds qui pete

Message par Vinchont » 30 Mai 2017 13:57

Bonjour, ça faisait longtemps, tiens.

Alors voilà, j'ai fait cette transition dans une coroutine, elle fait un fondu au noir, deplace le joueur et enfin fondu à l'image, sauf que:
1/le 1er crossfadealpha est instantanée
2/le debug s'arrete à la ligne "Fading from" avant le WaitForSeconds:

J'ai cru que la coroutine était en tors, mais je viens de trouver en cherchant sur le forum que c'est l'environnement normal pour utiliser le crossfadeAlpha, ce qui me perd encore plus.

Si vous m'aidez avec ça, pour la fin de la semaine, je mettrai une V0 du rail editor à disposition pour avoir quelques retours sur son utilisation, :)

Code : Tout sélectionner

                        Debug.Log("Starting a fade out");
                        this.GetComponent<BoxCollider>().enabled = false;

                        Debug.Log("Setting colors");
                        currentColorImage.color = new Color(0f, 0f, 0f, 0f);
                        currentColorCanvas.enabled = true;
                        Debug.Log("Activated Canvas");

                        localTime = localTransitionTime * 0.3f;
                        Debug.Log("Setting time of fading : "+ localTime);

                        Debug.Log("Fading from "+ currentColorImage.color.a);
                        currentColorImage.CrossFadeAlpha(1f, localTime, false);
                        Debug.Log("Faded to " + currentColorImage.color.a);

                        transform.position = localDestPos;
                        localTime = localTransitionTime * 0.4f;
                        Debug.Log("Decided to wait for " + localTime);
                        yield return new WaitForSeconds(localTime);

                        localTime = localTransitionTime * 0.3f;
                        currentColorImage.CrossFadeAlpha(0f, localTime, false);

                        currentColorCanvas.enabled = false;

                        this.GetComponent<BoxCollider>().enabled = true;
Ô checour, :/
Dernière édition par Vinchont le 31 Mai 2017 14:04, édité 1 fois.

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

Re: [MY-AL]CrossFadeAlpha qui fade pas et WaitForSeconds qui pete

Message par boubouk50 » 30 Mai 2017 14:41

1/ Essaie d'ajouter:

Code : Tout sélectionner

currentColorImage.canvasRenderer.SetAlpha (1.0f ou 0.0f );
avant le CrossFadeAlpha.
Source

2/ c'est

Code : Tout sélectionner

Debug.Log("Fading from "+ currentColorImage.color.a);
ou

Code : Tout sélectionner

currentColorImage.CrossFadeAlpha(1f, localTime, false);
qui est en cause?
"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

Vinchont
Messages : 62
Inscription : 18 Sep 2014 14:48

Re: [MY-AL]CrossFadeAlpha qui fade pas et WaitForSeconds qui pete

Message par Vinchont » 30 Mai 2017 14:59

1/ Le canvas s'affiche bien; J'ai essayé d'inverser les valeurs de l'alpha (de opaque vers transparent ) du currentColorImage et l'écran noir de départ s'affiche, il n'y a juste pas le fondu.

2/ c'est vraiment le WaitForSeconds qui plante, j'ai debugué en pas à pas, et arrivé à cette ligne, mon curseur saute directement à la fin de la méthode. et n'y retourne jamais...

Du coup, est-ce qu'il manquerait une ligne "yield return null" quelque part?

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

Re: [MY-AL]CrossFadeAlpha qui fade pas et WaitForSeconds qui pete

Message par boubouk50 » 30 Mai 2017 15:24

WaitForSeconds () ne plante pas. Cette fonction marche depuis des années sans souci.

Code : Tout sélectionner

yield return new WaitForSeconds(localTime);
Si cette fonction passe directement sans attendre, c'est que localTime est très court (voir inférieur au deltaTime entre 2 frames). La suite se fait dans la frame à la fin du yield return new WaitForSeconds(localTime); vu qu'il n'y a pas de yield par la suite.
Peut-être as-tu mal saisi l'utilisation ou d'une coroutine, du yield ou du WaitForSeconds ()?
mon curseur saute directement à la fin de la méthode. et n'y retourne jamais...
Pourquoi elle y retournerait? Il n'y a pas de boucle.
"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

Vinchont
Messages : 62
Inscription : 18 Sep 2014 14:48

Re: [MY-AL]CrossFadeAlpha qui fade pas et WaitForSeconds qui pete

Message par Vinchont » 30 Mai 2017 16:16

Ben je les ai utilisé ailleurs à de multiples reprises sans problèmes (yield, WaitForSeconds et les coroutines en général, j'en ai partout dans mon editeur), donc, je dirais non.

Le localTime est de 4s, valeur "4" dans le debug. On compte bien en secondes, pas en millisecondes il me semble?

D'ailleurs, un getType() de localTime renvoie un "System.Single", c'est normal pour un flottant?

J'avoue, je ne sais plus où chercher...

Je vais démonter toute ma méthode ce soir et la remonter morceau par morceau pour tester isolement les fonctions...

Je reviendrai quand j'aurai un résultat.

Merci!

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

Re: [MY-AL]CrossFadeAlpha qui fade pas et WaitForSeconds qui pete

Message par boubouk50 » 30 Mai 2017 16:32

Code : Tout sélectionner

localTime = localTransitionTime * 0.3f;
                        Debug.Log("Setting time of fading : "+ localTime);

                        Debug.Log("Fading from "+ currentColorImage.color.a);
                        currentColorImage.CrossFadeAlpha(1f, localTime, false);
                        Debug.Log("Faded to " + currentColorImage.color.a);

                        transform.position = localDestPos;
                        localTime = localTransitionTime * 0.4f;
                        Debug.Log("Decided to wait for " + localTime);
                        yield return new WaitForSeconds(localTime);
Le CrossFadeAlpha est instantané dans la suite logique de la boucle, pas dans le résultat. C'est comme s'il lançait une coroutine de son coté. Il est normal que les Debug.Log () soient à la suite tant que le yield return n'est pas lancé.

Code : Tout sélectionner

localTime = localTransitionTime * 0.3f;
			Debug.Log("Setting time of fading : "+ localTime);

                        Debug.Log("Fading from "+ currentColorImage.color.a);
                        currentColorImage.CrossFadeAlpha(1f, localTime, false);
                       
                        localTime = localTransitionTime * 0.4f;
                        Debug.Log("Decided to wait for " + localTime);
                        yield return new WaitForSeconds(localTime);
                        Debug.Log("Faded to " + currentColorImage.color.a);
                        transform.position = localDestPos; //Changement de position avant la fin du Fade sinon
J'ai l'impression que tu penses que le CrossFadeAlpha arrête la coroutine le temps qu'il s'exécute alors que ce n'est pas le cas. Il faut attendre sa résolution par un WaitForSeconds (), je pense. Je ne pense pas qu'un yield return currentColorImage.CrossFadeAlpha(1f, localTime, false); fonctionne, mais tu peux tester sinon.
"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

Vinchont
Messages : 62
Inscription : 18 Sep 2014 14:48

Re: [MY-AL]CrossFadeAlpha qui fade pas et WaitForSeconds qui pete

Message par Vinchont » 30 Mai 2017 21:55

J'ai l'impression que tu penses que le CrossFadeAlpha arrête la coroutine le temps qu'il s'exécute alors que ce n'est pas le cas. Il faut attendre sa résolution par un WaitForSeconds (), je pense.
Mais si c'était ça, mon code fonctionnerait vu que je fais suivre mon crossfade par un waitforseconds plus long, :/.

Dans le doute J'ai testé "yield return currentColorImage.CrossFadeAlpha(1f, localTime, false);" et ça ne passe même pas la compilation.

j'ai aussi testé le currentColorImage.canvasRenderer.SetAlpha (1.0f ou 0.0f ); pas plus de resultat.

En fait, apres plus de tentatives, le waitForSeconds est la seule chose qui fonctionne dans la boucle.

Je vais me renseigner d'avantage sur le crossFadeAlpha.

Nazarick
Messages : 60
Inscription : 03 Avr 2017 21:44

Re: [MY-AL]CrossFadeAlpha qui fade pas et WaitForSeconds qui pete

Message par Nazarick » 31 Mai 2017 02:30

Yop,
...elle fait un fondu au noir, deplace le joueur et enfin fondu à l'image...
Ce n'est pas un réponse en soit, plus une question mais, tu cherches à faire un FadeInOut pour téléporter un joueur d'un point A à un point B dans l'entre deux ?

Si c'est le cas pourquoi ne pas gérer via l'animator le FadeIn / FadeOut ? Avec un event placé sur la fin des animations + une simple coroutine pour gérer un délai entre les deux le temps de déplacer le personnage et le tour est joué. Personnellement j'utilise cette méthode pour mes deux types de Fade et ma LetterBox, ça laisse un code vraiment léger à gérer au final.

Si ce n'est pas ton but autant pour moi, j'avoue ne pas être sûr à 100% de ce que tu cherches à faire en lisant ton premier message.

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

Re: [MY-AL]CrossFadeAlpha qui fade pas et WaitForSeconds qui pete

Message par boubouk50 » 31 Mai 2017 09:14

Et si vraiment tu veux aller plus loin, tu peux programmer une extension de la classe Image pour créer une fonction de Fade à ta sauce.
Tu peux aussi jouer avec l'alpha du CanvasGroup accessible facilement.
"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

Vinchont
Messages : 62
Inscription : 18 Sep 2014 14:48

Re: [MY-AL]CrossFadeAlpha qui fade pas et WaitForSeconds qui pete

Message par Vinchont » 31 Mai 2017 09:22

ça laisse un code vraiment léger à gérer au final.
Oui, mais ça disperse les ressources à mon gout, et si je peux le faire par code, je préfère le faire; c'est peut-être une erreur de ma part cela dit, hein? Et puis comme ça, je suis censé pouvoir moduler facilement la durée de mes fondus.
Mais c'est peut-être aussi facilement faisable avec une animation, j'avoue ne pas être un spécialiste du sujet, j'en ai créé une seule jusque là pour faire tourner mes GO items.

Je cherche à faire fonctionner un fade pour l'instant, si je n'y arrive pas d'ici vendredi, j'opterai surement pour une animation.
Merci pour l'alternative! :)
Tu peux aussi jouer avec l'alpha du CanvasGroup accessible facilement.
... Mais c'est que c'est pas bête du tout, ça...

Répondre

Revenir vers « (C#) CSharp »