IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Unity Discussion :

Déplacer un objet avec la souris de manière fluide en gardant la physique


Sujet :

Unity

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 273
    Points : 150
    Points
    150
    Par défaut Déplacer un objet avec la souris de manière fluide en gardant la physique
    Salut à tous !

    Je développe depuis peu un programme d'aménagement de meubles en 3D avec Unity, je n'avais jamais développé sous Unity auparavant mais je saisis plutôt bien le concept ^^
    Je bloque sur une fonctionnalité (fondamentale dans mon projet) que j'aimerais développer :
    J'aimerais pouvoir déplacer un GameObject sur le sol d'une pièce (Axes X et Z donc, Y reste fixe) avec la souris, pour ça j'utilise la fonction ScreenPointToRay pour convertir la position de ma souris vers un Ray, je vérifie ensuite s'il touche un obstacle (en l’occurrence le sol) pour ensuite récupérer la position de l'impact, je déplace ensuite le GameObject en suivant les position de point.x et point.z avec MovePosition

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void OnMouseDrag()
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
     
            if (Physics.Raycast(ray, out hit, Camera.main.farClipPlane, 1 << LayerMask.NameToLayer("Floor")))
            {
                    GetComponent<Rigidbody>().MovePosition(new Vector3(hit.point.x, 0.12f, hit.point.z));
            }
        }
    Mon soucis est que peu importe la fonction que j'utilise pour mon déplacement, que ce soit transform.position, MovePosition, Rigidbody.position etc.. aucun de ces déplacements ne respecte la physique et mes GameObjects peuvent donc pénétrer l'un dans l'autre ou traverser les murs...

    J'ai essayé de faire la même fonction avec AddForce mais le soucis c'est que le mouvement du GameObject est pas aussi fluide qu'avec un MovePosition

    Voila le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void OnMouseDrag()
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
     
            if (Physics.Raycast(ray, out hit, Camera.main.farClipPlane, 1 << LayerMask.NameToLayer("Floor")))
            {
                    screenPoint = new Vector3(hit.point.x, 0.12f, hit.point.z);
                    GetComponent<Rigidbody>().AddForce((screenPoint - transform.position).normalized * 5000 * Time.deltaTime);
            }
        }
    (J'ai évidement essayé de changer Mass ou Drag de mon GameObject, mais c'est soit trop rapide soit trop lent, puisque la vitesse de la souris varie bien entendu...)

    Quelqu'un aurait une idée pour résoudre mon problème ?

    Merci d'avance

  2. #2
    Membre expert

    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Février 2006
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 1 031
    Points : 3 092
    Points
    3 092
    Par défaut
    Salut,

    tu vas trouver un début de réponse ici :

    https://unity3d.com/fr/learn/tutoria...nd-fixedupdate

    Bon courage !
    Suivez le développement de Chibis Bomba
    twitter : https://twitter.com/MoD_DiB
    DevBlog : http://moddib.blogspot.fr/

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 273
    Points : 150
    Points
    150
    Par défaut
    Salut,

    Je connais la différence entre Update et FixedUpdate (si je me trompe pas, le premier s’exécute par image par seconde et l'autre peut s’exécuter a fréquence choisie) mais je ne vois pas en quoi ça peut m'aider a résoudre mon problème ? La question de la fluidité de mon AddForce ne vient pas de la fréquence d’exécution du script je crois ^^
    Je ne sais pas vraiment dans quel sens chercher en fait, est ce que je cherche a faire un déplacement fluide avec AddForce ou est ce que je cherche a faire un déplacement avec transform.position mais en prenant en compte la physique ?

    Edit : Je viens de tester un déplacement avec mon code dans la fonction FixedUpdate et le temps de latence global est effectivement réduit, mais ça ne résous pas le problème qui fait que mon MovePosition ne respecte pas vraiment la physique

  4. #4
    Membre expert

    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Février 2006
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 1 031
    Points : 3 092
    Points
    3 092
    Par défaut
    Tu dois bosser avec Addforce sinon la physique ne fonctionnera pas.
    Ton objet dispose bien d'un rigidbody qui n'est pas en kinematic ?
    Poste ton dernier code avec la modification du FixedUpdate.

    As a general rule:

    Input should be in Update(), so that there is no chance of having a frame in which you miss the player input (which could happen if you placed it in FixedUpdate(), say).

    Physics calculations should be in FixedUpdate(), so that they are consistent and synchronised with the global physics timestep of the game (by default 50 times per second).

    Camera movement should be in LateUpdate(), so that it reflects the positions of any objects that may have moved in the current frame.
    Suivez le développement de Chibis Bomba
    twitter : https://twitter.com/MoD_DiB
    DevBlog : http://moddib.blogspot.fr/

Discussions similaires

  1. Comment déplacer un objet avec le souris
    Par foufou.mr dans le forum NetBeans
    Réponses: 2
    Dernier message: 29/10/2015, 23h15
  2. comment déplacer un objet avec la souris
    Par domi's dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 13/05/2014, 07h51
  3. [C#] Déplacer un composant avec la souris
    Par GéniuS77 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 07/04/2011, 23h12
  4. déplacer un objet avec la souris
    Par pingpong dans le forum OpenGL
    Réponses: 4
    Dernier message: 24/10/2007, 01h54
  5. Déplacer un panel avec la souris
    Par Harry dans le forum Delphi
    Réponses: 14
    Dernier message: 05/06/2006, 19h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo