Ich versuche ein Spiel zu erstellen, in dem Objekte gezogen werden können, aber ich habe Probleme mit der Physik. Bei starren Körpern mit ähnlichen Massen drücken sie sich beim Ziehen manchmal gegenseitig durch und verursachen unerwünschte Bewegungen. Hier ist eine Demo .
Ich möchte dies nur mit der in Unity 3D integrierten Physik tun .
In der Demo können Sie mit der Maus auf Objekte klicken und diese ziehen. Die Zylinder haben alle Kastenkollider und Massen von 10000. Sie haben auch verschiedene Einschränkungen in Abhängigkeit von ihrer Ausrichtung (keiner kann sich drehen und alle sind in x oder y eingeschränkt). Die Kugel hat eine Masse von 1, einen Kugelkollider und eine Az-Bedingung.
Die Kugel und die Zylinder interagieren gut. Das Übereinanderziehen der Zylinder führt jedoch zu einer Überschneidung. Ich will das nicht!
Bei den Zylindern ist die Interpolation auf "Interpolieren" und die Kollisionserkennung auf "Kontinuierlich" eingestellt. Ich habe das Skript 'DontGoThroughThings' auf alle Zylinder geworfen , aber es scheint nichts zu bewirken . Für die Einstellung der Geschwindigkeit der Starrkörper habe ich beide folgenden Zeilen mit im Grunde dem gleichen Ergebnis verwendet:
rb.AddForce(speed * diff * Time.deltaTime - rb.velocity, ForceMode.VelocityChange);
//rb.velocity = speed * diff * Time.deltaTime;
Ohne meinen eigenen Kollisionserkennungscode zu schreiben, habe ich keine Ideen mehr. Gibt es eine einfache Einstellung oder etwas, das ich verpasst habe?
Im Zusammenhang mit dem erläuterten Kontext ist hier eine genauere Frage: "Wie kann ich die Zylinder in meiner Demo dazu bringen, sich nicht gegenseitig zu bewegen?"
Antworten:
Ohne auf Ihr Projekt / Ihren Code zu schauen, möchte ich Folgendes vorschlagen:
Damit können Sie die Physik einschränken, jedoch innerhalb des Bereichs und der Physik-Engine von Unity. Sie können mit dem Skript herumwackeln, damit nur ein zu verschiebendes Objekt usw. gesperrt wird. Dies sollte Ihnen jedoch den Einstieg erleichtern.
quelle
Sie möchten, dass die Kollisionserkennung
Continuous Dynamic
für sich schnell bewegende Objekte eingestellt ist.Continuous
wird für statische oder sich langsam bewegende Objekte verwendet, mit denenContinuous Dynamic
Objekte kollidieren. Siehe hier .(Beachten Sie, dass die kontinuierliche Kollisionserkennung teuer ist. Verwenden Sie sie daher sparsam.)
quelle