[RESOLU][MY-AL] Bloquer le viseur autour du personnage

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Répondre
Badfly
Messages : 62
Inscription : 19 Mai 2017 14:46

[RESOLU][MY-AL] Bloquer le viseur autour du personnage

Message par Badfly » 04 Mai 2018 15:51

Bonjour à tous,

Alors je vous explique je suis sur un jeu 2D avec la possibilité de jouer avec une manette.
Le joueur peut placer son viseur autour de son personnage avec le stick droit de la manette. Le viseur doit rester à une certaine distance autour du joueur (ça forme donc un cercle autour du personnage).

J'ai actuellement ce code : 

Code : Tout sélectionner

void Update()
{
            if (controller.GetAxisRaw("Move Crosshair Horizontal") != 0 || controller.GetAxisRaw("Move Crosshair Vertical") != 0)
            {
                Vector2 _positionCrossHair = new Vector2(transform.position.x + controller.GetAxisRaw("Move Crosshair Horizontal"), transform.position.y + controller.GetAxisRaw("Move Crosshair Vertical"));
                crossHair.transform.position = _positionCrossHair;
            }
 }
Je n'utilise pas l'InputManager, mais un asset Rewired pour gérer les inputs manette et le multijoueur.
Dans le code "controller" correspond à la manette du joueur fournis par l'outil. Ce script est posé sur le GameObject Joueur.
"Move Crosshair Horizontal" correspond à l'axe des x du stick droite de la manette.
"Move Crosshair Vertical" correspond à l'axe des y du stick droite de la manette.

Ce script fonctionne à moitié étant donné que quand le joueur relâche le stick, le viseur retourne sur le personnage (ce qui est normal car "controller.GetAxisRaw("Move Crosshair Horizontal") " sera égale à 0. Mais si le joueur maintient le stick à fond dans une direction le viseur se placera au bon endroit (on peut même faire tourner le stick se qui fera tourner le viseur autour du joueur un cercle)
Ce que j'aimerais c'est que même si le joueur relâche totalement le stick ou partiellement (stick pas orienté au max) le viseur du joueur reste à une certaine distance. Et doit donc être «Lock» sur un axe.

A savoir que GetAxisRaw me renvois max 1. Par exemple si le stick à fond vers la droite, controller.GetAxisRaw("Move Crosshair Horizontal") sera égale à 1.
Je précise que je n'ai pas mit la variable distance pour l'instant, que je souhaiterais juste que le viseur reste à à la même distance (prenons le max 1), je pourrais par la suite multiplié le tout par une variable distance.

Alors j'ai eu l'idée de calculer le point de croisement entre le cercle de centre Joueur et de rayon 1 (rayon sera égale à la variable distance), et une droite passant par Joueur jusqu'à la position Joueur + Stick manette.
J'ai donc commencé mes recherches, et sur le papier c'est pas très compliqué (calcul du coefficient directeur de la droite, calcul de l'équation de la droite, équation du cercle etc...) mais je me retrouve avec des équations avec des x et x². Et j'avoue que je ne sais pas retranscrire cela en programmation.

J'ai aussi tenté de placer le viseur en tant qu'enfant d'un GameObject motor, que je pourrais faire tourner, mais ça ne représentait pas la sensation voulu.

Je me complique surement la tête pour quelque chose de simple, et je serais ravi d'avoir vos conseil soit sur un autre moyen de résoudre mon problème, soit sur la réalisation d'équation en code.

Je sais que c'est pas facile à comprendre comme ça, n'hésitez pas si vous avez des questions.
Dernière édition par Badfly le 17 Mai 2018 11:30, édité 1 fois.

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

Re: [MY-AL] Bloquer le viseur autour du personnage

Message par boubouk50 » 04 Mai 2018 16:05

Je ne sais pas si j'ai tout pige à ton fonctionnement mais de ce que j'ai compris, j'utiliserai la fonction Cosinus.
Image
En utilisant l'axe horizontal (compris entre -1 et 1) comme cosinus, tu peux retrouver l'angle x à attribuer à ton pointeur. Ensuite en fonction du signe de y, tu peux déterminer si c'est vers le haut ou le bas.
Il ne te reste plus qu'à associer cet angle à la rotation de ton pointeur autour du personnage et le tour est joué. Il n'y a presque pas de maths.
"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

Badfly
Messages : 62
Inscription : 19 Mai 2017 14:46

Re: [MY-AL] Bloquer le viseur autour du personnage

Message par Badfly » 04 Mai 2018 16:44

Bonjour Boubouk et merci de ta réponse.

Le problème est que je ne recherche pas un angle, mais des coordonnées.

Image

Ici, le viseur se trouve "entre" les bords du cercle et le joueur. L'idée est de continuer cette droite jusqu'à l'intersection M pour trouver les coordonnées de ce point.

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

Re: [MY-AL] Bloquer le viseur autour du personnage

Message par boubouk50 » 04 Mai 2018 16:54

Il faut utiliser la magnitude d'un vecteur pour borner ton pointeur.
https://docs.unity3d.com/ScriptReferenc ... itude.html
"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

Badfly
Messages : 62
Inscription : 19 Mai 2017 14:46

Re: [MY-AL] Bloquer le viseur autour du personnage

Message par Badfly » 04 Mai 2018 16:56

Jamais entendu parler, je vais me renseigner sur ça du coup. Merci de l'aide :D

Badfly
Messages : 62
Inscription : 19 Mai 2017 14:46

Re: [MY-AL] Bloquer le viseur autour du personnage

Message par Badfly » 09 Mai 2018 09:24

Bonjour à tous et désolé de ressortir ce sujet après plusieurs jours.

Je me suis renseigné sur la magnitude des Vectors, mais j'avoue ne pas comprendre l'utilité dans le problème que je rencontre. Aurais-tu plus d'information à ce sujet ?

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

Re: [MY-AL] Bloquer le viseur autour du personnage

Message par boubouk50 » 09 Mai 2018 10:11

La magnitude te renvoie la taille du vecteur. Il te suffit donc de le borner. Si la magnitude est supérieure à la distance max alors la magnitude vaut la distance max. Donc ton vecteur est de taille 0 à distance max
"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

Badfly
Messages : 62
Inscription : 19 Mai 2017 14:46

Re: [MY-AL] Bloquer le viseur autour du personnage

Message par Badfly » 12 Mai 2018 16:18

Désolé de mon temps de réponse un peu long.

Merci boubouk de ta réponse.
Si la magnitude est supérieure à la distance max alors la magnitude vaut la distance max
La magnitude ne peut pas être modifier directement, du coup je fais comment pour que la magnitude soit égale à la distance ?
Si le viseur est plus loin par exemple, je réduis le x et le y du vecteur de 0.1 admettons tant qu'il n'est pas égale à la distance max ?

Badfly
Messages : 62
Inscription : 19 Mai 2017 14:46

Re: [MY-AL] Bloquer le viseur autour du personnage

Message par Badfly » 12 Mai 2018 17:41

Eurêka !!! J'ai trouvé une solution à mon problème.

Pour diminuer la magnitude, il faut utiliser Vector2.Normalize() pour réduire le vecteur à un ratio 1 pour le multiplié par la distance par la suite. Du coup, si ça intéresse de reproduire ça, voici le code en question à mettre dans un Update: 

Code : Tout sélectionner

	
            Vector2 _posCrosshair = new Vector2((crossHair.transform.position.x + controller.GetAxis("Move Crosshair Horizontal")) - transform.position.x, crossHair.transform.position.y + controller.GetAxis("Move Crosshair Vertical") - transform.position.y);
            _posCrosshair.Normalize();
            crossHair.transform.position = new Vector2(transform.position.x + _posCrosshair.x, transform.position.y + _posCrosshair.y) * distanceCrosshair;    

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

Re: [MY-AL] Bloquer le viseur autour du personnage

Message par boubouk50 » 14 Mai 2018 10:33

Merci de penser à mettre ton sujet en résolu lorsque la solution est trouvée pour le signaler aux autres membres. Il suffit d'ajouter [RESOLU] en début de titre du premier message, par édition.
"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

Répondre

Revenir vers « Scripting »