[Résolu] Problème de position de canvas
[Résolu] Problème de position de canvas
Bonjour,
J'ai un problème sur le positionnement de mes canvas ( jeu en 3D ).
Ce que je voudrais faire c'est de pouvoir positionner le canvas en fonction de la rotation de ma camera par rapport à la position d'un PNJ.
En gros j'aimerais placer le canvas vers la direction du PNJ, c'est à dire que si par exemple le PNJ ce situe à gauche de ma caméra ( hors du champ ), et qu'une discussion est lancé, j'aimerais pouvoir placer le canvas sur le bord a gauche de l'écran.
Le problème c'est que je ne sais pas du tout quoi m'orienter ?
Merci !
J'ai un problème sur le positionnement de mes canvas ( jeu en 3D ).
Ce que je voudrais faire c'est de pouvoir positionner le canvas en fonction de la rotation de ma camera par rapport à la position d'un PNJ.
En gros j'aimerais placer le canvas vers la direction du PNJ, c'est à dire que si par exemple le PNJ ce situe à gauche de ma caméra ( hors du champ ), et qu'une discussion est lancé, j'aimerais pouvoir placer le canvas sur le bord a gauche de l'écran.
Le problème c'est que je ne sais pas du tout quoi m'orienter ?
Merci !
Dernière édition par Warcza le 15 Déc 2016 16:38, édité 1 fois.
(╯°□°)╯︵ ┻━┻
- boubouk50
- ModoGenereux
- Messages : 6245
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: Problème de position de canvas
Il faut déjà déterminer le comportement complet.
Comment réagit ton Canvas lorsque tu bouges la caméra? Admettons qu'au départ le P¨NJ est à gauche mais que tu bouges/tournes/etc et qu'il se retrouve en face ou à droite, tu veux que le Canvas réagisse en temps réel ou bien qu'une fois qu'il est placé, il ne bouge plus?
Comment se présente ton Canvas? (parce que le Canvas c'est "l'encapsuleur", tu vas avoir une boite de dialogue dedans je suppose ou autre)
Comment réagit ton Canvas lorsque tu bouges la caméra? Admettons qu'au départ le P¨NJ est à gauche mais que tu bouges/tournes/etc et qu'il se retrouve en face ou à droite, tu veux que le Canvas réagisse en temps réel ou bien qu'une fois qu'il est placé, il ne bouge plus?
Comment se présente ton Canvas? (parce que le Canvas c'est "l'encapsuleur", tu vas avoir une boite de dialogue dedans je suppose ou autre)
"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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: Problème de position de canvas
Lorsque l'on bouge la caméra, le canvas ( la boite de dialogue plutot *) doit adapter sa position en temps réel et non resté fixe une fois placé.
Sinon oui y a une boite de dialogue, quand j'ai dis canvas j'englobé ma boite de dialogue dedans ^^', j'aurais surement du parler directement de la boite de dialogue vue que c'est lui qui va changer de position (si je me trompe pas o_o).
Sinon j'ai oublié de préciser que le canvas est en Overlay.
Sinon oui y a une boite de dialogue, quand j'ai dis canvas j'englobé ma boite de dialogue dedans ^^', j'aurais surement du parler directement de la boite de dialogue vue que c'est lui qui va changer de position (si je me trompe pas o_o).
Sinon j'ai oublié de préciser que le canvas est en Overlay.
(╯°□°)╯︵ ┻━┻
- boubouk50
- ModoGenereux
- Messages : 6245
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: Problème de position de canvas
Ceci n'est qu'une réflexion, je n'ai pas la façon générale/correcte de faire.
Si ton PNJ est à l'écran alors, tu peux récupérer la position à l'écran avec Camera.WorldToScreen et donc ainsi placer la boite de dialogue où bon te semble.
S'il ne l'est pas, tu peux comparer le vecteur forward de la caméra avec le vecteur Caméra/PNJ et ainsi déterminer la position par rapport à la caméra avec l'angle issu ou bien le dot product, et placer la boite de dialogue en conséquence.
Si ton PNJ est à l'écran alors, tu peux récupérer la position à l'écran avec Camera.WorldToScreen et donc ainsi placer la boite de dialogue où bon te semble.
S'il ne l'est pas, tu peux comparer le vecteur forward de la caméra avec le vecteur Caméra/PNJ et ainsi déterminer la position par rapport à la caméra avec l'angle issu ou bien le dot product, et placer la boite de dialogue en conséquence.
"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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: Problème de position de canvas
Bon, j'ai pas eu trop le temps de tester tout ça hier, mais j'ai fais quelques tests ce matin et j'ai quelques questions ;s.
Pour la fonction WorldToScreenPoint j'ai fais quelques recherche et je suis pas sur de bien comprendre sur le résultat qu'il doit nous donner, si je fais ceci :
Est-ce qu'elle doit me retourner l'emplacement ou doit ce placer la boite de dialogue pour être sur la "target" ?
Dans mon cas, je sais pas trop ou il essaie de placer la boite de dialogue, elle reste principalement sur le centre de l'écran, même si la target est sur le bord ou le coin de l'écran.
Par contre quand la target sort de l'écran la boite de dialogue sort également de l'écran.
Ce qui du coup avec le Dot je peu savoir quand il sort depuis le code ( donc pas de problème de ce coté la ), mais il calcule seulement sur l'axe horizontale non ? c'est à dire que si je fais une rotation de ma caméra de haut en bas, le Dot à lui seul ne me permet pas de savoir si je doit placer la boite de dialogue vers le haut ou vers le bas si ?
Merci !
Pour la fonction WorldToScreenPoint j'ai fais quelques recherche et je suis pas sur de bien comprendre sur le résultat qu'il doit nous donner, si je fais ceci :
Code : Tout sélectionner
Vector3 test = camera.WorldToScreenPoint ( target.position );
Dans mon cas, je sais pas trop ou il essaie de placer la boite de dialogue, elle reste principalement sur le centre de l'écran, même si la target est sur le bord ou le coin de l'écran.
Par contre quand la target sort de l'écran la boite de dialogue sort également de l'écran.
Ce qui du coup avec le Dot je peu savoir quand il sort depuis le code ( donc pas de problème de ce coté la ), mais il calcule seulement sur l'axe horizontale non ? c'est à dire que si je fais une rotation de ma caméra de haut en bas, le Dot à lui seul ne me permet pas de savoir si je doit placer la boite de dialogue vers le haut ou vers le bas si ?
Merci !
(╯°□°)╯︵ ┻━┻
- boubouk50
- ModoGenereux
- Messages : 6245
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: Problème de position de canvas
WorldToScreenPoint va te renvoyer les coordonnées pixels à l'écran même si la target n'est pas à l'écran. Il te faut donc les interpréter. J'ai trouvé ce post qui peut t'aider http://answers.unity3d.com/questions/28 ... viour.html.
Ensuite, c'est à toi de positionner ta dialogBox en fonction des coordonnées screen renvoyés. Si tu veux ta dialogBox centrée, il te faut un pivot central sur ta dialogBox et tu la places à cet endroit. Du coup, il faut que tu fasses attention aux marges pour pas que ta DialogBox sorte du cadre. Tu clampes le pivot en tout cas et ça devrait le faire.
Pour le dot, tu peux retirer un axe pour avoir une projection planaire sur XZ (horizontal) ou YZ (vertical) et déterminer la position verticale et horizontale séparément. Tu peux également récupérer le vecteur target dans l'espace de la camera pour connaître sa position par rapport à la caméra.
Ensuite, c'est à toi de positionner ta dialogBox en fonction des coordonnées screen renvoyés. Si tu veux ta dialogBox centrée, il te faut un pivot central sur ta dialogBox et tu la places à cet endroit. Du coup, il faut que tu fasses attention aux marges pour pas que ta DialogBox sorte du cadre. Tu clampes le pivot en tout cas et ça devrait le faire.
Pour le dot, tu peux retirer un axe pour avoir une projection planaire sur XZ (horizontal) ou YZ (vertical) et déterminer la position verticale et horizontale séparément. Tu peux également récupérer le vecteur target dans l'espace de la camera pour connaître sa position par rapport à la caméra.
"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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: Problème de position de canvas
J'ai un peu galéré, mais c'est bon j'ai finalement réussi
Merci pour l'aide!
Merci pour l'aide!
(╯°□°)╯︵ ┻━┻
- boubouk50
- ModoGenereux
- Messages : 6245
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: Problème de position de canvas
N'hésite pas à mettre le sujet en résolu si tout est réglé.
Et si cela ne te dérange pas de partager ton code (ou une partie), cela serait vraiment utile pour les autres membres et ce forum.
Et si cela ne te dérange pas de partager ton code (ou une partie), cela serait vraiment utile pour les autres membres et ce forum.
"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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: [Résolu] Problème de position de canvas
C'est pas parfait, mais c'est suffisant pour l'instant :
Code : Tout sélectionner
if ( Vector3.Dot ( camera.transform.forward, targetPos - camera.transform.position ) >= 0 )
{
thisPos = camera.WorldToScreenPoint ( targetPos );
}
else
{
thisPos = -camera.WorldToScreenPoint ( targetPos );
}
Code : Tout sélectionner
Transform getPopUp = null;
getPopUp = menuPopUp.transform.Find ( "PopUpDialogue" );
RectTransform getThisPopUp = getPopUp.GetComponent<RectTransform> ( );
thisPos.x -= getThisPopUp.rect.width / 2;
thisPos.y += getThisPopUp.rect.height / 2;
if ( thisPos.x + getThisPopUp.rect.width / 2 >= Screen.currentResolution.width )
{
thisPos.x = Screen.currentResolution.width - getThisPopUp.rect.width / 2;
}
else if ( thisPos.x - getThisPopUp.rect.width / 2 <= -Screen.currentResolution.width )
{
thisPos.x = -Screen.currentResolution.width + getThisPopUp.rect.width / 2;
}
if ( thisPos.y + getThisPopUp.rect.height / 2 >= Screen.currentResolution.height )
{
thisPos.y = Screen.currentResolution.height - getThisPopUp.rect.height / 2;
}
else if ( thisPos.y - getThisPopUp.rect.height / 2 <= -Screen.currentResolution.height )
{
thisPos.y = -Screen.currentResolution.height + getThisPopUp.rect.height / 2;
}
getPopUp.localPosition = thisPos;
(╯°□°)╯︵ ┻━┻