J'apporte encore une autre question de glisser avec la souris (j'utilise Unity avec C #), mais avec un détail particulier moins commun: l'existence d'obstacles au milieu du chemin à travers lequel le glissement se produit (espace 3D, pas 2D) .
Laisse-moi expliquer. Supposons que j'ai un plan sur lequel je veux faire glisser un cube appelé "obj". C'est facile. Voici ma mise en œuvre simple pour cela:
void Update () {
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if(Physics.Raycast(ray, out hit, 1000000))
obj.transform.position = new Vector3(hit.point.x,0.25F,hit.point.z);
}
Ça marche. Cependant, supposons que j'ai également quelques autres cubes au-dessus de l'avion, qui sont les obstacles. De toute évidence, lorsque le joueur se déplace "obj" au-dessus de l'avion, ce mouvement doit être bloqué par les obstacles. Et puis, en entrant en collision avec les obstacles, "obj" ne devrait se déplacer que sur les côtés de cet obstacle. Si la souris est déplacée et que "obj" cesse d'entrer en collision avec des obstacles, le mouvement de style glisser libre reprend à nouveau.
Pour rendre le défi plus difficile, j'essaie de le faire sans utiliser de composants RigidBody aux obstacles (l'objet traîné peut l'avoir). Avez-vous des idées sur la manière la plus efficace d'y parvenir? Merci beaucoup!
EDIT: Les commentateurs ont attiré mon attention sur le fait que je devrais mentionner que les objets peuvent pivoter lors de la capture.
EDIT 2: Compte tenu de la difficulté de la formulation d'origine, j'ai changé la question permettant l'utilisation de composants Rigidbody au niveau des objets glissés. La solution ne peut tout simplement pas utiliser des composants Rigidbody aux obstacles.
Réponses:
Il est difficile de détecter une collision sans aucun corps rigide impliqué, mais puisque vous utilisez des cubes, vous pouvez peut-être utiliser des limites . Chaque mise à jour, vérifiez si les limites de l'objet glissé se croisent avec les limites des obstacles. Si c'est le cas, vous pouvez essayer ceci:
Vous n'arrêtez jamais de faire glisser le bloc; il apparaît simplement à l'utilisateur que le bloc a cessé de glisser alors qu'il se croiserait avec un obstacle.
la source
Sans l'avoir fait moi-même, voici ce que j'essaierais:
Il me semble que si vous souhaitez que votre objet traîne le long d'un plan incliné d'un obstacle, vous devriez simplement faire en sorte que sa transformation continue de suivre la position du dernier hit raycast.
la source