[MY- AL] problème de joystick

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
maliimaloo
Messages : 45
Inscription : 28 Sep 2017 19:06

[MY- AL] problème de joystick

Message par maliimaloo » 13 Nov 2017 15:06

Bonjour à tous ceux qui liront mon Poste,

Mon problème se compose de 3 problèmes similaires et m’énerve, j'ai créé un script [Solo] d'un joystick qui va me permettre de déplacer le personnage, dans la direction ou le joystick ira.

/!\Mais/!\ (il y a toujours des mais) maintenant j'aimerais faire en sorte que quand le bouton ira en bas cela activera une animation particulière que ma créatrice graphisme/animation m'aura faite mais j'y arrive uniquement avec la marche vers l'avant et le problème c'est que je trouve pas de solution pour faire l'animation sans que le script ne Bug.

J’espère que vous pourrez m'aider cela m’enlèverait une grosse épine du pied : p

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class JoystickVirtuel : MonoBehaviour, IDragHandler, IPointerUpHandler, IPointerDownHandler
{
    private Image bgImg; 
    private Image joystickImg; 
    private Vector3 inputVector;

    public GameObject player;
    private Animator anim;

    public void Start()
    {
        anim = player.GetComponent<Animator>();
        bgImg = GetComponent<Image>(); 
        joystickImg = transform.GetChild(0).GetComponent<Image>();
    }

    public virtual void OnDrag(PointerEventData ped)
    {

        Vector2 pos; 
        
        if (RectTransformUtility.ScreenPointToLocalPointInRectangle(bgImg.rectTransform, ped.position, ped.pressEventCamera, out pos))
        {
            pos.x = (pos.x / bgImg.rectTransform.sizeDelta.x);

            pos.y = (pos.y / bgImg.rectTransform.sizeDelta.y);

            inputVector = new Vector3(pos.x * 2 + 1, 0, pos.y * 2 - 1);
            inputVector = (inputVector.magnitude > 1.0f) ? inputVector.normalized : inputVector;
            joystickImg.rectTransform.anchoredPosition = new Vector3(inputVector.x * (bgImg.rectTransform.sizeDelta.x / 3), inputVector.z * (bgImg.rectTransform.sizeDelta.y / 3));
            anim.SetBool("Marcher", true);
            Debug.Log(inputVector);
        }
    }

    public virtual void OnPointerDown(PointerEventData ped) 
    {
        OnDrag(ped);
    }

    public virtual void OnPointerUp(PointerEventData ped) 
    {
        inputVector = Vector3.zero; 
        joystickImg.rectTransform.anchoredPosition = Vector3.zero;
                                                                   
        anim.SetBool("Marcher", false);
    }

    public float Horizontal()
    {
        if (inputVector.x != 0)
            return inputVector.x;
        else
            return Input.GetAxis("Horizontal");
    }

    public float Vertical()
    {
        if (inputVector.x != 0)
            return inputVector.z;
        else
            return Input.GetAxis("Vertical");
    }
}

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

Re: [MY- AL] problème de joystick

Message par boubouk50 » 13 Nov 2017 15:18

Pour un joystick, tu as une valeur renvoyée entre -1 et 1, il te suffit donc simplement de tester cette valeur pour faire l'un ou l'autre. Positive ou négative donc.
"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

maliimaloo
Messages : 45
Inscription : 28 Sep 2017 19:06

Re: [MY- AL] problème de joystick

Message par maliimaloo » 13 Nov 2017 15:24

Merci de ta réponse, mais tu n'aurais pas genre un exemple mais juste un exemple pour tester la position :p

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

Re: [MY- AL] problème de joystick

Message par boubouk50 » 13 Nov 2017 15:32

Tu me dis que tu as scripté cela mais que tu ne sais pas faire un if? :pasdrole:
Tu dis que tu veux lancer une animation (ce que tu sais faire) quand le "bouton ira en bas" (ce que je comprends comme étant joystick bas) donc si ton float renvoyé par Vertical () est négatif, non?
Ici tu as la fonction Vertical () mais elle n'est pas appelée par contre...
"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

maliimaloo
Messages : 45
Inscription : 28 Sep 2017 19:06

Re: [MY- AL] problème de joystick

Message par maliimaloo » 13 Nov 2017 15:34

Cela est normal pour la fonction Vertical, elle est appeler dans mon script de déplacement du perssonage, pour que mon perssonage se déplace en fonction du joystick, mais si je sais faire un if, mais je ne c'est pas quoi tester :p

Esque c'est le InputVector que je doit tester, c'est tous se que j'aimerais savoir :p

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

Re: [MY- AL] problème de joystick

Message par boubouk50 » 13 Nov 2017 15:58

Ben, je t'ai déjà donné la réponse: C’est le résultat. Enfin, je suppose d'après lecture, puisque je n'ai pas tous les éléments.
Atta... Ton joystick... ce serait pas par hasard un bouton virtuel et pas un VRAI joystick? Et donc c'est la direction du drag qui est importante? Dans ta fonction Vertical (), tu n'aurais pas une erreur de copier-coller non plus?
if (inputVector.z != 0) au lieu de if (inputVector.x != 0)
A quoi sert le GetAxis ("Vertical") du coup?
"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

maliimaloo
Messages : 45
Inscription : 28 Sep 2017 19:06

Re: [MY- AL] problème de joystick

Message par maliimaloo » 13 Nov 2017 16:12

Oui mon joystick est constituer de deux images, la première la base et la deuxième sont enfant et c'est l'enfant qui bouge.

Le GetAxis ("Vertical") permet que si je met mon enfant en diagonal de mes points d'encrage de ma base, cela avancera en même temps tourneras, cela me permet d'éviter de faire juste avant, gauche et droite, et de tourner la caméra par exemple si je veut tourner vers la droite, cela tourne automatiquement sans avoir à faire un mouvement net.

je viens de vous décrire mon script pour que vous compreniez mieux :p

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class JoystickVirtuel : MonoBehaviour, IDragHandler, IPointerUpHandler, IPointerDownHandler
{
    private Image bgImg; //Ceci sera l'image qui contiendras le Joystick
    private Image joystickImg; //Ceci sera l'image du joystick qui bougeras
    private Vector3 inputVector; //J'appelerais ma class Vector3 'Utiliser x,y,z', quand j'appelerais 'inputVector'

    public GameObject player;
    private Animator anim;



    public void Start()
    {
        anim = player.GetComponent<Animator>();
        bgImg = GetComponent<Image>(); //Je déclare au lancement le chemin ou se trouve mon 'bgImg', que j'utilise l'image de l'objet ou est attacher le script 'Pas besoin de mettre this.'
        joystickImg = transform.GetChild(0).GetComponent<Image>();
        //transform.GetChild(0), permet de transformer la position du premier enfant de l'objet de jeu auquel ce script est attaché.
        //Ensuite je décmare me chemin ou se trouve L'image.
    }

    public virtual void OnDrag(PointerEventData ped) //Quand le pointeur est glisser
    {
        //*****************************************************
        // Fonctionalité pour obtenir la position de mon pointeur
        // ou je le déplace dans le rectangle de mon 'bgImg'
        //*****************************************************

        Vector2 pos; //Je déclare une variable pos qui va utiliser Vector 2 'x,y'

        // (RectTransformUtility.ScreenPointToLocalPoint.... permet de déclarer que l'on va utiliser toute la surface 'le Rectangle' de mon image ou est attacher le script
        if (RectTransformUtility.ScreenPointToLocalPointInRectangle(bgImg.rectTransform, ped.position, ped.pressEventCamera, out pos))
        {
            pos.x = (pos.x / bgImg.rectTransform.sizeDelta.x);
            //Je dit que je veut utiliser l'axe 'x' de mon Vector 2 et que il est égal
            //à 'pos.x'  Diviser par la distance des points d'encrage  de 'bas en haut = x' de mon 'bgImg'.

            pos.y = (pos.y / bgImg.rectTransform.sizeDelta.y);
            //Je dit que je veut utiliser l'axe 'y' de mon Vector 2 et que il est égal
            //à 'pos.y'  Diviser par la distance des points d'encrage  de 'gauche à droite = y' de mon 'bgImg'.




            inputVector = new Vector3(pos.x * 2 + 1, 0, pos.y * 2 - 1);
            inputVector = (inputVector.magnitude > 1.0f) ? inputVector.normalized : inputVector;
            joystickImg.rectTransform.anchoredPosition = new Vector3(inputVector.x * (bgImg.rectTransform.sizeDelta.x / 3), inputVector.z * (bgImg.rectTransform.sizeDelta.y / 3));
            anim.SetBool("Marcher", true);
            Debug.Log(inputVector);
        }
    }

    public virtual void OnPointerDown(PointerEventData ped) //Quand le pointeur est Appuyer
    {
        OnDrag(ped); //j'appelle ma fonction OnDrag
    }

    public virtual void OnPointerUp(PointerEventData ped) //Quand le pointeur est pas appuyer ou relacher
    {
        inputVector = Vector3.zero; //Celi veut dire que les 3 positions sont égal à (x:0, y:0, z:0)
        joystickImg.rectTransform.anchoredPosition = Vector3.zero; //On dit que la position ou se trouve l'image du joystick qui bouge, sera en position '0, 0, 0'
                                                                   //cela permet de remettre l'image du joystick au centre quand l'on n'appuie pplus ou pasdessus
        anim.SetBool("Marcher", false);
    }

    public float Horizontal()
    {
        if (inputVector.x != 0)
            return inputVector.x;
        else
            return Input.GetAxis("Horizontal");
    }

    public float Vertical()
    {
        if (inputVector.x != 0)
            return inputVector.z;
        else
            return Input.GetAxis("Vertical");
    }
}

maliimaloo
Messages : 45
Inscription : 28 Sep 2017 19:06

Re: [MY- AL] problème de joystick

Message par maliimaloo » 13 Nov 2017 16:54

Voici mon script de déplacement du joueur

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class DeplacementJoueur : MonoBehaviour
{

    private CharacterController controller;
    private Vector3 dDirection;

    private float deltaTime;
    public float speed = 5.0f;
    public float rotationspeed = 3.0f;

    private float verticalVelocity = 0.0f;
    public float gravity = 25.0f;

    private Animator anim;

    public JoystickVirtuel joystick;

    void Start()
    {
        anim = GetComponent<Animator>();
        controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        dDirection.z = joystick.Vertical();
        dDirection.x = joystick.Horizontal();
        dDirection.y = verticalVelocity;
        dDirection = transform.TransformDirection(dDirection);

        controller.Move(dDirection * Time.deltaTime * speed);
        transform.Rotate(new Vector3(0, joystick.Horizontal() * rotationspeed, 0));

        if (!controller.isGrounded)
        {
            verticalVelocity -= gravity * Time.deltaTime;
        }

    }
}

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

Re: [MY- AL] problème de joystick

Message par boubouk50 » 13 Nov 2017 17:32

Ça ne change rien à ma réponse. Il faut tester la négativité de ta valeur verticale pour savoir si tu vas vers le bas.

Je ne comprends pas ce que tu ne comprends pas.
Tu as déjà programmé le déplacement, c'est bien que tu as déjà programmé cette information et que tu l'as utilisé. Il te suffit simplement de l'utiliser encore.
"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

maliimaloo
Messages : 45
Inscription : 28 Sep 2017 19:06

Re: [MY- AL] problème de joystick

Message par maliimaloo » 13 Nov 2017 18:11

C'est bon j'ai trouvais ma solution en faisant plein de test, j'ai réussie à diviser mon joystick en 4 partie :p, haut gauche, haut droite, bas gauche et bas droite :p

Ducoup je me sert de mon Vector2 'pos', comme tu peux le voir :p
Donc dans mes if j'ai juste à mettre mes animations ducoup, gauche, droite avancer, et gauche droite reculer :p

Code : Tout sélectionner

            if (pos.x < 0.0f && pos.y > 0.0f)
                Debug.Log("1");
            if (pos.x > 0.0f && pos.y > 0.0f)
                Debug.Log("2");
            if (pos.x < 0.0f && pos.y < 0.0f)
                Debug.Log("3");
            if (pos.x > 0.0f && pos.y < 0.0f)
                Debug.Log("4");
Pièces jointes
Sans titre.png
Sans titre.png (10.69 Kio) Consulté 3371 fois

Répondre

Revenir vers « (C#) CSharp »