[Résolu] Problème de position de canvas

Questions à propos du GUI, y compris la partie script.
Répondre
Warcza
Messages : 160
Inscription : 18 Fév 2016 20:49

[Résolu] Problème de position de canvas

Message par Warcza » 14 Déc 2016 11:46

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 !
Dernière édition par Warcza le 15 Déc 2016 16:38, édité 1 fois.
(╯°□°)╯︵ ┻━┻

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

Re: Problème de position de canvas

Message par boubouk50 » 14 Déc 2016 11:51

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)
"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

Warcza
Messages : 160
Inscription : 18 Fév 2016 20:49

Re: Problème de position de canvas

Message par Warcza » 14 Déc 2016 11:58

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.
(╯°□°)╯︵ ┻━┻

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

Re: Problème de position de canvas

Message par boubouk50 » 14 Déc 2016 12:21

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.
"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

Warcza
Messages : 160
Inscription : 18 Fév 2016 20:49

Re: Problème de position de canvas

Message par Warcza » 14 Déc 2016 12:25

Okk, je vais essayer ça.
Merci !
(╯°□°)╯︵ ┻━┻

Warcza
Messages : 160
Inscription : 18 Fév 2016 20:49

Re: Problème de position de canvas

Message par Warcza » 15 Déc 2016 12:20

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 :

Code : Tout sélectionner

Vector3 test = camera.WorldToScreenPoint ( target.position );
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 !
(╯°□°)╯︵ ┻━┻

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

Re: Problème de position de canvas

Message par boubouk50 » 15 Déc 2016 12:33

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.
"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

Warcza
Messages : 160
Inscription : 18 Fév 2016 20:49

Re: Problème de position de canvas

Message par Warcza » 15 Déc 2016 16:03

J'ai un peu galéré, mais c'est bon j'ai finalement réussi :)

Merci pour l'aide!
(╯°□°)╯︵ ┻━┻

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

Re: Problème de position de canvas

Message par boubouk50 » 15 Déc 2016 16:31

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. :perv:
"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

Warcza
Messages : 160
Inscription : 18 Fév 2016 20:49

Re: [Résolu] Problème de position de canvas

Message par Warcza » 15 Déc 2016 16:51

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;
(╯°□°)╯︵ ┻━┻

Répondre

Revenir vers « L'interface GUI »