[DB] Positionner un Scroll Rect sur un autre objet

Questions à propos du GUI, y compris la partie script.
Julianx2
Messages : 213
Inscription : 25 Sep 2013 22:23
Localisation : Paris

[DB] Positionner un Scroll Rect sur un autre objet

Message par Julianx2 » 11 Mai 2017 12:40

Bonjour,

Je viens vous demander de l'aide car je suis un peu perdu avec l'UI. J'aimerais faire descendre le Scroll Rect et le positionner sur un autre objet sur Y. Je vous explique rapidement le principe :

Le joueur répond à une question, si il a vrai, il descend de "cases" en "cases" (qui représentent chacune une question.) J'aimerais que lorsque il a eu vrai à cette question, le scroll rect descende automatiquement à la prochaine case de façon douce, comme lors d'une animation.

Image
Image

Pour le moment, je m'en sort en utilisant ceci : myScrollRect.verticalNormalizedPosition = 0.90f;
Le problème, c'est que bien entendu, je téléporte le scroll directement à la prochaine case et il n'y a rien de "smooth" là-dedans !

Je ne sais pas si cela est possible, qu'en pensez-vous ?

Merci d'avance :)
Dernière édition par Julianx2 le 11 Mai 2017 23:55, édité 2 fois.
Quizy - Culture Générale & Quiz - https://play.google.com/store/apps/deta ... XON.Quizy2

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

Re: [DB] Positionner un Scroll Rect sur un autre objet

Message par simonj » 11 Mai 2017 13:54

Salut,

Pour faire un déplacement smooth, tu peux utiliser une Co-Routine qui va recalculer une interpolation entre les deux valeurs à chaque frame grâce à Math.Lerp.

Une fonction un peu comme ça :

Code : Tout sélectionner

IEnumerator GoTo(float a_destValue)
{
	float startValue = myScrollRect.verticalNormalizedPosition;
	float percent = 0f;
	
	while(percent <= 1f)
	{
		myScrollRect.verticalNormalizedPosition = Mathf.Lerp(startValue, a_destValue, Mathf.Clamp01(percent));
		percent += Time.deltaTime;
	}
}
Sachant que dans cette fonction tu va faire ton animation en 1 seconde car ton percent augmente de 0 à 1 en 1s grâce à l'ajout du Time.deltaTime. Si tu veux modifier la vitesse, tu peux mettre des coefficient multiplicateur sur ton percent.

Julianx2
Messages : 213
Inscription : 25 Sep 2013 22:23
Localisation : Paris

Re: [DB] Positionner un Scroll Rect sur un autre objet

Message par Julianx2 » 11 Mai 2017 15:20

Merci pour ta réponse,

Cela semble fonctionner mais le rect revient toujours automatiquement à sa position d'origine, il ne tient pas en place.. j'ai loupé quelque chose ?

Code : Tout sélectionner

 StartCoroutine(GoTo(5f));

//////////////////////////////////////// 

IEnumerator GoTo(float a_destValue)
    {
        yield return new WaitForSeconds(1);

        float startValue = myScrollRect.verticalNormalizedPosition;
        float percent = 0f;

        while (percent <= 1f)
        {
            myScrollRect.verticalNormalizedPosition = Mathf.Lerp(startValue, a_destValue, Mathf.Clamp01(percent));
            percent += Time.deltaTime;
        }
    }
Quizy - Culture Générale & Quiz - https://play.google.com/store/apps/deta ... XON.Quizy2

Avatar de l’utilisateur
evereal
Messages : 109
Inscription : 06 Nov 2015 18:46

Re: [DB] Positionner un Scroll Rect sur un autre objet

Message par evereal » 11 Mai 2017 16:11

Il faudrait mettre le yield dans la boucle while.

Code : Tout sélectionner

 StartCoroutine(GoTo(5f));

////////////////////////////////////////

IEnumerator GoTo(float a_destValue)
    {
        float startValue = myScrollRect.verticalNormalizedPosition;
        float percent = 0f;

        while (percent <= 1f)
        {
            myScrollRect.verticalNormalizedPosition = Mathf.Lerp(startValue, a_destValue, Mathf.Clamp01(percent));
            percent += Time.deltaTime;
            yield;
        }
    }
    
“La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !”

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

Re: [DB] Positionner un Scroll Rect sur un autre objet

Message par simonj » 11 Mai 2017 16:37

evereal a écrit :Il faudrait mettre le yield dans la boucle while.

Code : Tout sélectionner

 StartCoroutine(GoTo(5f));

////////////////////////////////////////

IEnumerator GoTo(float a_destValue)
    {
        float startValue = myScrollRect.verticalNormalizedPosition;
        float percent = 0f;

        while (percent <= 1f)
        {
            myScrollRect.verticalNormalizedPosition = Mathf.Lerp(startValue, a_destValue, Mathf.Clamp01(percent));
            percent += Time.deltaTime;
            yield;
        }
    }
    
Je suis bête, j'ai effectivement oublié le "yield return new WaitEndOfFrame();" dans la boucle... :gene:

Julianx2
Messages : 213
Inscription : 25 Sep 2013 22:23
Localisation : Paris

Re: [DB] Positionner un Scroll Rect sur un autre objet

Message par Julianx2 » 11 Mai 2017 22:52

Yes merci à vous,

Je me suis complètement planté sur les valeurs ! Debug.Log(startValue); m'as permis d'y voir plus clair !

Je cherche juste comment recréer la start position à partir de la Dot en cours maintenant car à chaque fois ça fini par remonter en haut!
Aussi, pour plus de précision, y aurait-il possibilité de transformer ceci :

Code : Tout sélectionner

 StartCoroutine(GoTo(0.90f));
En quelque chose comme cela ?

Code : Tout sélectionner

 StartCoroutine(GoTo("GameObjectPosition"));
Pour l’animation, ça fonctionne super bien merci c'est génial :amen:
Quizy - Culture Générale & Quiz - https://play.google.com/store/apps/deta ... XON.Quizy2

Avatar de l’utilisateur
evereal
Messages : 109
Inscription : 06 Nov 2015 18:46

Re: [DB] Positionner un Scroll Rect sur un autre objet

Message par evereal » 12 Mai 2017 10:25

Je pense que ton composant scrollRect est mal placé.
Avec une valeur de 0.9f tu devrais te trouver en bas de ta liste (donc a la dernière question a peu prêt). Si tu es seulement en bas de ta première question ça me laisse croire que tu as mis le composant directement sur le rectTransform de ta première question au lieu du rectTransform qui regroupe toute les questions.

Julianx2 a écrit :En quelque chose comme cela ?
StartCoroutine(GoTo("GameObjectPosition"));
Oui, il faudra recalculer la position relative de ta question en fonction du rectTransform conteneur.

Code : Tout sélectionner

IEnumerator GoTo(GameObject question)
    {
        float longueurConteneur = conteneur.sizeDelta.y;
        float questionYPos = question.anchorMin.y;
        float relativePosition = questionYPos / longueurConteneur;
        float startValue = myScrollRect.verticalNormalizedPosition;
        float percent = 0f;

        while (percent <= 1f)
        {
            myScrollRect.verticalNormalizedPosition = Mathf.Lerp(startValue, relativePosition, Mathf.Clamp01(percent));
            percent += Time.deltaTime;
            yield;
        }
    }
    
“La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !”

Julianx2
Messages : 213
Inscription : 25 Sep 2013 22:23
Localisation : Paris

Re: [DB] Positionner un Scroll Rect sur un autre objet

Message par Julianx2 » 12 Mai 2017 11:36

Salut !

J'ai essayé de modifier tout ça mais je n'ai pas réussi à revenir à des valeurs "normales"

Image


Concernant ceci, cela dépasse largement mes compétences je ne comprend pas grand chose...

Code : Tout sélectionner

IEnumerator GoTo(GameObject question) 
    {
        float longueurConteneur = conteneur.sizeDelta.y;
        float questionYPos = question.anchorMin.y;
        float relativePosition = questionYPos / longueurConteneur;
        float startValue = myScrollRect.verticalNormalizedPosition;
        float percent = 0f;

        while (percent <= 1f)
        {
            myScrollRect.verticalNormalizedPosition = Mathf.Lerp(startValue, relativePosition, Mathf.Clamp01(percent));
            percent += Time.deltaTime;
            yield;
  • Quand tu marques : IEnumerator GoTo(GameObject question) comment dois-je call la coroutine ? (StartCoroutine(GoTo(GameObject.position ? ));)
  • "Conteneur" est donc le ScrollRect ou le Canvas complet ?
Je suis un peu perdu, je vais pour le moment rester sur une simple modification des valeurs via StartCoroutine(GoTo(0.90f));

Merci pour l'aide c'est sympa! :cote:
Quizy - Culture Générale & Quiz - https://play.google.com/store/apps/deta ... XON.Quizy2

Julianx2
Messages : 213
Inscription : 25 Sep 2013 22:23
Localisation : Paris

Re: [DB] Positionner un Scroll Rect sur un autre objet

Message par Julianx2 » 26 Mai 2017 10:36

Salut !

Je reviens sur ce sujet car la modification des valeurs n'est pas assez précise, il me faut l'emplacement exact des dots pour y arriver...

Honnêtement je suis un peu perplexe, je ne comprend pas le code. Actuellement le panel slide jusqu'en bas du scroll.

Quelqu'un peut-il m'aider avec ça ? Merci :)

Code : Tout sélectionner

    public GameObject Dot;
    public ScrollRect myScrollRect;
    public float longueurConteneur;
    public RectTransform conteneur;
    public RectTransform question;


    IEnumerator GoTo(GameObject Dot)
    {
        float longueurConteneur = conteneur.sizeDelta.y;
        float questionYPos = question.anchorMin.y;
        float relativePosition = questionYPos / longueurConteneur;
        float startValue = myScrollRect.verticalNormalizedPosition;
        float percent = 0f;

        while (percent <= 1f)
        {
            myScrollRect.verticalNormalizedPosition = Mathf.Lerp(startValue, relativePosition, Mathf.Clamp01(percent));
            percent += Time.deltaTime;
            yield return new WaitForSeconds(.1f);
        }
    }
Je lance via : StartCoroutine(GoTo(Dot));

public ScrollRect myScrollRect; = Mon ScrollRect logiquement
public float longueurConteneur; = Mon conteneur des dots ? J'ai essayé avec le scroll et le canvas sans succès...
public RectTransform conteneur; = Le même j'imagine
public RectTransform question; = ?
Quizy - Culture Générale & Quiz - https://play.google.com/store/apps/deta ... XON.Quizy2

Répondre

Revenir vers « L'interface GUI »