minuschki Posted August 11 Report Share Posted August 11 Hallo zusammen Ich möchte gerne ein Minigolf in 3D kreieren. Dafür nehme ich mehrere im Grundriss quadratische Elemente (z.B. standard Cubes) und ordne diese genau zu einer Bahn an. Nun gebe ich der Kugel mittels rb.AddForce(power * transform.forward, ForceMode.Impulse); einen Antrieb und sie rollt zügig über die Bahn. Obwohl die Elemente haargenau den gleichen Y-Wert haben, hüpft die Kugel nach einer Weile vom Boden weg. Bei grösserer Geschwindigkeit schiesst sie dann plötzlich wie eine Kanonenkugel in die Luft. Wie kann das sein? Der Boden ist doch topfeben. Wenn ich die Kugel anstatt über 20 aneinandergereihte Cuben, über einen einzelnen sehr langen Cube (Balken) rollen lasse, rollt diese perfekt auf dem Balken und hebt keinen Millimeter vom Boden ab. Wenn ich anstatt den Standard Cubes meine richtigen Minigolfelemente benutzte (diese haben dann einen Meshcollider) passiert eigentlich der gleiche Effekt und manchmal ist es sogar so, dass die Kugel beim Übertritt ins nächste Element komplett gestoppt wird, als wäre sie gegen eine durchsichtige Wand geprallt. Wie kann ich also erreichen, dass die Kugel sauber über die Fläche rollt und nicht plötzlich abhebt? Quote Link to comment Share on other sites More sharing options...
Sascha Posted August 11 Report Share Posted August 11 Moin! Deine Kugel rollt ja nicht horizontal, sondern ein wenig nach unten. Das macht die Gravitation, die jedes Physik-Update draufgerechnet wird. Und die willst du ja auch haben. Dass du trotzdem horizontal bleibst, liegt nur an den Collidern unter der Kugel, mit denen du in jedem Frame aufs neue kollidierst. Das Problem entsteht dadurch, dass die Kugel je nach Umstand nicht mit der Oberseite, sondern mit der vorderen Kante eines Cubes kollidieren kann. Die Kugel rollt hier von links nach rechts. Schwarz ist die aktuelle Position, rot die Zielposition, bevor Kollisionen aufgelöst werden. Links betritt sie den rechten Cube durch die Oberseite (Kontakt-Areal ist orange), rechts geht's durch die Ecke. Die Physik-Engine versteht leider nicht, dass der linke Collider die Kugel eigentlich davon abhält, die vertikale Seite des rechten Colliders zu berühren. Deshalb wird eine Kollision an einer vertikalen Wand ermittelt. Je nach Winkel springt die Kugel deshalb nach oben oder bleibt komplett stehen. Du kannst in den Physik-Einstellungen in den Project Settings eine Einstellung ändern, die den Mindestwert eines Kollisionsimpulses beschreibt. Wenn du ihn höher stellst, dann ignoriert die Engine kleinere Hüpfer. Das hilft natürlich nicht so richtig, weil du immer noch drüber kommen kannst, aber auch, weil damit das Stehenbleiben nicht behoben wird. Mal davon abgesehen kannst du damit Impulse kaputt machen, die du eigentlich behalten wolltest. Das war aber leider auch schon die einzige simple Lösung. Wesentlich sinnvoller, aber leider auch schwieriger, wäre "Skin Width". Da kriegt der Collider noch eine Speckschicht außen herum, und wenn da etwas hinein gerät, wird deine Kugel einfach so weit verschoben, dass die Schicht wieder frei ist - ohne dabei einen Impuls zu erzeugen. Leider können Rigidbodys das meines Wissens nach aber nicht. Du kannst sonst noch ein bisschen mit der Form der Collider experimentieren. Eigentlich brauchst du da ja keine Würfel. Aber so richtig endgültig wird auch das nicht sein. Wenn du da nicht selber so richtig tief einsteigen willst, kann noch ein Blick in den Asset Store helfen. Leider ist ausgerechnet so etwas simples wie ein rollender Ball gar nicht mal so einfach umzusetzen. Quote Link to comment Share on other sites More sharing options...
minuschki Posted August 12 Author Report Share Posted August 12 Danke für deine ausführliche und informative Antwort! Ich verstehe nun die Problematik. Komischerweise sind eine ganze Reihe von solchen Minigolf Tutorials in Youtube zu finden, aber nirgends wird auf das Problem hingewiesen. Ich könnte mir aber folgende Lösungsansätze vorstellen: Variante ohne Rigidbody • Könnte man nicht mit einem abwärtsgerichteten Ray laufend den Untergrund abtasten und die Kugel so im Radiusabstand über den Boden gleiten lassen. So nach dem Prinzip Hooverboard). Aus meiner Sicht wäre es so möglich, über Mulden und Hügel zu rollen und die Kugel könnte auch in ein Loch fallen. Allerdings müssten bei dieser Variante noch Berechnungen gemacht werden, welche die Kugel je nach Steigung abbremst, beschleunigt oder ablenkt. Eventuell wäre es dann sinnvoll, dazu den Contactpoint und den dazugehörenden Normal zu Hilfe zu nehmen. Keine Ahnung, ob das so machbar wäre. Variante mit Rigidbody • Ich habe noch ein Tool (Realtime CSG), welches boolsche Operationen erlaubt. So könnte ich eine grosse Plattform erzeugen und diese dann mit Vertiefungen, Erhebungen oder Löchern und Randbegrenzungen versehen. Allerdings hätte diese Variante nicht die Möglichkeit mit Einzelmodulen eine ganze Bahn runtime zu generieren. Welche Variante würdest du empfehlen? Quote Link to comment Share on other sites More sharing options...
Sascha Posted August 12 Report Share Posted August 12 vor 40 Minuten schrieb minuschki: Variante ohne Rigidbody Der Ansatz klingt erstmal nicht schlecht, aber ich kann dir leider gerade nicht sagen, ob du damit zum Ziel kommst. Wenn du mit deinem Projekt nicht gerade unter Zeitdruck stehst, dann würde ich es an deiner Stelle einfach versuchen. Im Zweifelsfall lernst du bestimmt eine Menge. vor 42 Minuten schrieb minuschki: Variante mit Rigidbody Dein Design kommt zuerst. Wenn du prozedural generierte Level oder einen Level-Editor haben willst, dann ist die Lösung raus. Deine Vision davon, wie das Spiel sein soll, für einen Kompromiss zu opfern, kommt meiner Meinung nach nicht in Frage, solange es noch andere Optionen gibt. Davon abgesehen könnte es durchaus funktionieren. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.