2016-08-01 26 views
2

Wir versuchen ein 2D-Sandbox-Spiel zu implementieren, in dem der Spieler seine eigene "Maschine" bauen kann.Unity FixedJoint2D Fehler

Also, was wir im Code tun, ist, dass wir das neue Objekt direkt neben dem Block, an den es angehängt werden soll, transformieren und ein FixedJoint2D (bzw. WheelJoint2D) hinzufügen, um es zu reparieren. Irgendwann ist uns aufgefallen, dass eine komplexere Maschine (mit vielen Teilen) instabil werden kann, wenn zu viel Kraft auf sie ausgeübt wird.

Eine Aufzeichnung des Fehlers in Zeitlupe: https://www.youtube.com/watch?v=Ym4LsuqMNfE

Die Winkelgeschwindigkeit von jedem Teil der Maschine beginnt irgendwann instabil zu werden, bevor die „Explosion“ in dem Video passiert. Bei Sekunde 9 und 24 befindet sich jedes Objekt der Maschine und jedes Objekt, mit dem es in Berührung gekommen ist (würfelförmige, sogar kinematische Objekte), in der Mitte der Welt (direkt hinter dem roten Block) bei 0,0.

Weiß jemand, was das verursachen könnte? Es würde auch helfen, wenn uns jemand sagen könnte, was die besten Praktiken sind, um solche Probleme zu verfolgen.

Bearbeiten: Eine vereinfachte Version des Codes. Dies ist, wie unser Update() -Methode wie folgt aussieht:

if (Input.GetMouseButtonDown(1) && ...) { connectSelectedBlock(); }

während connectSelectedBlock() wie dies vereinfacht aussieht:

connectSelectedBlock(){ GameObject newBlock = Instantiate(blockToPlace); ... FixedJoint2D joint = gameObject.AddComponent<FixedJoint2D>(); joint.connectedBody = newBlock.GetComponent<Rigidbody2D>(); joint.autoConfigureConnectedAnchor = false; return joint; }

Antwort

0

Eines der teuersten und zeitraubende Tätigkeit in der Einheit wird zum Ausgleich Physikobjekte, die Gelenke (und dergleichen) verwenden. Das Video zeigt ein typisches Verhalten, das auf unausgeglichene physikalische Interaktion zurückzuführen ist. Oft werden Sie feststellen, dass Sie jedes "Schlüssel" -Objekt mit einem Skript versehen müssen, damit Sie die Gelenkparameter zur Laufzeit ändern können. Keine leichte Aufgabe, das kann ich garantieren. Stellen Sie außerdem sicher, dass die physikbezogene Logik in der FixedUpdate() -Methode geschieht, und vermeiden Sie bei der Operation Update() sorgfältig alle Operationen, die möglicherweise eine physikalische Interaktion haben.

+0

Ich aktualisierte den Beitrag durch eine vereinfachte Version des Codes. Was vermissen wir dabei? Wenn Sie sagen "... damit Sie die Gelenkparameter zur Laufzeit ändern können", was meinen Sie genau? Welche Gelenkparameter? Jede Information würde uns helfen. – Yggdrasill