Partage
  • Partager sur Facebook
  • Partager sur Twitter

Grab Object with mouse Unity C#

Problème de vitesse de déplacement de la souris

    31 mars 2023 à 11:46:17

    Bonjour,

    Je créé ce poste afin de recevoir un coup de main sur un sujet sur Unity C# : le raycast.

    Le contexte est le suivant : j'essaye de créer un script qui me permettrait de déplacer des objets 3D avec ma souris.

    Avec le code suivant, j'y parviens :

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class S_RayCast : MonoBehaviour
    {
        public Ray ray;
        public RaycastHit hit;
    
        public bool isMousePressed;
        public Vector3 newPos;
        public Transform currentPos;
    
        // Update is called once per frame
        void Update()
        {
            ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    
            if (Physics.Raycast(ray, out hit))
            {
                currentPos = hit.collider.transform;
                newPos = new Vector3(hit.point.x, 0, hit.point.z);
    
                isMousePressed = true;
            }
    
            if (!Physics.Raycast(ray, out hit))
            {
                currentPos = null;
                newPos = Vector3.zero;
                isMousePressed = false;
            }
    
            if (Input.GetMouseButton(0))
            {
                if (isMousePressed)
                {
                    currentPos.position = newPos;
                }
            }
    
            if (Input.GetMouseButtonUp(0))
            {
                isMousePressed = false;
            }
        }
    }

    Je ne modifie pas l'axe y de l'objet touché par le raycast car la caméra du projet est positionnée au-dessus de la scène.

    Un objet détecté par le raycast possède un box collider, sinon ce code ne servirait à rien.

    Je précise également que ce script est positionné sur la caméra, et non sur l'objet, car je ne souhaite pas créer de multiples objets avec ce script attaché à eux.

    Mais je m'égare, revenons à mon problème : avec ce code, j'ai presque ce qu'il me faut, un seul problème : lorsque je déplace la souris trop vite alors que j'ai attrapé un objet, le raycast échoue.

    Après des recherches sur le net, j'ai crû comprendre que cet événement était dû au fait que le raycast n'avait pas le temps de calculer la nouvelle position.

    On m'a proposé des solutions comme utiliser FixedUpdate(), ou placer un rigibody sur l'objet (sans succès).

    Hier soir, très tard (vers 3h00 du matin, oui je sais, je suis fou), j'ai trouvé une solution qui permet d'éviter ce problème :

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class S_RayCast : MonoBehaviour
    {
        private float dist;
        private Transform toDrag;
        private bool dragging;
        private Vector3 offset;
    
        Vector3 v3;
        RaycastHit hit;
    
        void Update()
        {
            if (Input.GetMouseButtonDown(0))
            {
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    
                if (Physics.Raycast(ray, out hit))
                {
                    toDrag = hit.transform;
                    dist = hit.transform.position.z - Camera.main.transform.position.z;
                    v3 = new Vector3(Input.mousePosition.x, Input.mousePosition.y, dist);
                    v3 = Camera.main.ScreenToWorldPoint(v3);
                    offset = toDrag.position - v3;
                    dragging = true;
                }
            }
            if (Input.GetMouseButton(0))
            {
                if (dragging)
                {
                    v3 = new Vector3(Input.mousePosition.x, Input.mousePosition.y, dist);
                    v3 = Camera.main.ScreenToWorldPoint(v3);
                    toDrag.position = new Vector3(v3.x + offset.x, 0, v3.z + offset.z);
                }
            }
            if (Input.GetMouseButtonUp(0))
            {
                dragging = false;
            }
        }
    }

    Peu importe la vitesse de déplacement de la souris, l'objet est bien déplacé, mais maintenant j'ai un autre problème : l'objet n'est plus sous le curseur de la souris.

    De plus, lorsque je me déplace vers les bords de mon écran, la vitesse de déplacement de l'objet (qui est à ce moment très faible comparé à ce que pouvait offrir le premier programme) ralentie progressivement jusqu'à une vitesse quasi-nulle.

    Avec tout ça, tout ce que je demande, c'est de l'aide pour avoir un résultat qui combinerait les deux résultats : un raycast qui me permettrait de grab les objets avec un collider, et que le raycast continue de fonctionner peu importe la vitesse de déplacement de ma souris.

    Je suis ouvert à toutes les solutions, alors n'hésitez pas !

    Merci d'avance à tous.

    -
    Edité par ReunanBeauvois 31 mars 2023 à 11:50:08

    • Partager sur Facebook
    • Partager sur Twitter

    Grab Object with mouse Unity C#

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown