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 :
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...
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)); } }
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 :
(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...)
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); } }
Quelqu'un aurait une idée pour résoudre mon problème ?
Merci d'avance
Partager