Jump to content
Unity Insider Forum

Kisten fallen herunter (2D Game)


minuschki
 Share

Recommended Posts

Hallo zusammen

In meinem 2D Game sollen Kisten herunterfallen und einen Turm bzw. eine Mauer bilden. Also habe ich ihnen einen Rigidbody und einen 2D Boxcollider angehängt und siehe da, die Kisten stapeln sich auf. Sie haben jeweils eine Seitenlänge von 2 und auch der Colider hat die Grösse 2 x 2.

Das Problem: Nach dem Fall sollten alle Kisten wieder eine Ganzzahl als Y-Wert haben, aber genau das funktioniert nicht! Beispielsweise hat der mittlere Würfel nach dem Fall anstelle des erwarteten Wertes -1 nun plötzlich -0.9944119 und die obere Kiste anstatt 1 den Wert 1.02. Ich habe versucht, den Boxcollider in der Höhe anzupassen, hat aber nicht funktioniert, da sich je nach Anzahl der herunterfallenden Kisten die jeweiligen Y-Werte andauernd verändern. Auch das manuelle nachkorrigieren auf eine Ganzzahl bringt nichts, da der Wert nicht bleibend übernommen wird und durch die Kollisionsfunktion gleich wieder durch einen Fliesskommawert ersetzt wird. Vielleicht muss man in den Einstellungen etwas schrauben.

Langer Rede kurzer Sinn: Wie erreiche ich, dass alle Kisten nach dem Fall immer eine Ganzzahl als Y-Wert haben?

 

Kisten.jpg

Einstellungen.jpg

Link to comment
Share on other sites

Ich glaube beim Default Contact Offset, könntest du schrauben.

Sei dir aber im Klaren, dass in Unity nie etwas genau 1 ist, wenn die genutzte Maßeinheit ein Float ist. Da gibt es immer Ungenauigkeiten.
Du solltest Versuchen einfach mit Näherungen zu arbeiten. Also fragst du nicht die Ganzen Zahlen ab sondern ein Ungefähr.
Ist der Wert innerhalb der Ganzzahl +- 0.05 oder so, dann mache etwas.

 

Link to comment
Share on other sites

Ok, danke für den Tipp!

Ich denke mit  Mathf.RoundToInt(obj.transform.position.y) sollte das klappen.

Das mit den Ungenauigkeiten ist natürlich doof und funktioniert auch in einer Schleife nicht korrekt, so dass man am Ende einer Transformation immer noch extra nachkorrigiert werden muss. Warum sich der Wert in einer 10er-Schleife, bei der in jedem Schritt 0.1f subtrahiert wird, im Total nicht -1 ergibt ist mir schleierhaft!

IEnumerator SchiebenUnten(GameObject ttt)
    {
        for (int i = 0; i < 10; i++)
        {
            ttt.transform.position = ttt.transform.position - new Vector3 (0, 0.1f, 0);
            yield return new WaitForSeconds(0.01f);
        }
        ttt.transform.position = zielPosition;                                // Teil auf die genaue Position setzen
    }

 

Link to comment
Share on other sites

Hah, da hast du das klassische Beispiel :)

Floats sind halt magisch. Sagen wir's so: 0.1 lässt sich im Binärsystem gar nicht mit einer endlichen Anzahl an Stellen darstellen. So wie man 1/3 im Dezimalsystem nicht mit endlich viel Stellen darstellen kann. Wenn du daher 0.1 als Float darstellst, hast du in Wirklichkeit 0.100000001490116119384765625... in deinen Bits stehen. 0.0009765625 dagegen lässt sich exakt darstellen ;) 

Hier kannst du ein bisschen mit Floats herumspielen, das kann helfen: https://www.h-schmidt.net/FloatConverter/IEEE754.html

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

×
×
  • Create New...