[DB] Positionner un Scroll Rect sur un autre objet
[DB] Positionner un Scroll Rect sur un autre objet
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.
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
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.
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
Re: [DB] Positionner un Scroll Rect sur un autre objet
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 :
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.
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;
}
}
Re: [DB] Positionner un Scroll Rect sur un autre objet
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 ?
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
Re: [DB] Positionner un Scroll Rect sur un autre objet
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 !”
Re: [DB] Positionner un Scroll Rect sur un autre objet
Je suis bête, j'ai effectivement oublié le "yield return new WaitEndOfFrame();" dans la boucle...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; } }
Re: [DB] Positionner un Scroll Rect sur un autre objet
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 :
En quelque chose comme cela ?
Pour l’animation, ça fonctionne super bien merci c'est génial
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));
Code : Tout sélectionner
StartCoroutine(GoTo("GameObjectPosition"));
Quizy - Culture Générale & Quiz - https://play.google.com/store/apps/deta ... XON.Quizy2
Re: [DB] Positionner un Scroll Rect sur un autre objet
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.
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.
Oui, il faudra recalculer la position relative de ta question en fonction du rectTransform conteneur.Julianx2 a écrit :En quelque chose comme cela ?
StartCoroutine(GoTo("GameObjectPosition"));
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 !”
Re: [DB] Positionner un Scroll Rect sur un autre objet
Salut !
J'ai essayé de modifier tout ça mais je n'ai pas réussi à revenir à des valeurs "normales"
Concernant ceci, cela dépasse largement mes compétences je ne comprend pas grand chose...
Merci pour l'aide c'est sympa!
J'ai essayé de modifier tout ça mais je n'ai pas réussi à revenir à des valeurs "normales"
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 ?
Merci pour l'aide c'est sympa!
Quizy - Culture Générale & Quiz - https://play.google.com/store/apps/deta ... XON.Quizy2
Re: [DB] Positionner un Scroll Rect sur un autre objet
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
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; = ?
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);
}
}
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