J'essaie de créer un jeu où les objets peuvent être glissés, mais j'ai des problèmes avec la physique. Avec des corps rigides qui ont des masses similaires, ils se poussent parfois lorsqu'ils sont traînés et provoquent des mouvements indésirables. Voici une démo .
J'aimerais le faire en utilisant uniquement la physique intégrée d'Unity 3D .
Dans la démo, vous pouvez utiliser la souris pour cliquer et faire glisser des objets. Les cylindres ont tous des collisionneurs de boîtes et des masses de 10000. Ils ont également diverses contraintes en fonction de leur orientation (aucun ne peut tourner, et tous sont contraints en x ou y). La sphère a une masse de 1, un collisionneur de sphères et une contrainte az.
La sphère et les cylindres interagissent bien. Cependant, faire glisser les cylindres les uns sur les autres provoque une intersection. Je ne veux pas ça!
Les cylindres ont l'interpolation réglée sur «Interpoler» et la détection de collision réglée sur «Continue». J'ai lancé le script «DontGoThroughThings» sur tous les cylindres, mais il ne semble rien faire. En ce qui concerne le réglage de la vitesse des corps rigides, j'ai utilisé les deux lignes suivantes avec essentiellement le même résultat:
rb.AddForce(speed * diff * Time.deltaTime - rb.velocity, ForceMode.VelocityChange);
//rb.velocity = speed * diff * Time.deltaTime;
Sans écrire mon propre code de détection de collision, je suis à court d'idées. Y a-t-il un cadre simple ou quelque chose que j'ai manqué?
Avec le contexte expliqué, voici une question plus précise: "Comment faire en sorte que les cylindres de ma démo ne se déplacent pas?"
Réponses:
Sans regarder votre projet / code, je voudrais suggérer ceci:
Il vous permettra de restreindre la physique, mais dans la portée et le moteur physique d'Unity. Vous pouvez bouger avec le script pour qu'il ne verrouille qu'un seul objet à déplacer, etc., mais cela devrait vous aider à démarrer.
la source
Vous voulez que la détection de collision soit définie
Continuous Dynamic
pour les objets en mouvement rapide.Continuous
est utilisé pour les objets statiques ou à déplacement lentContinuous Dynamic
avec lesquels les objets entrent en collision. Voyez ici .(Gardez à l'esprit que la détection de collision continue coûte cher, alors utilisez-la avec parcimonie)
la source