2017-07-05 2 views
3

Ich versuche, ein Objekt so zu bewegen, dass es sich visuell mit der gleichen Geschwindigkeit bewegt, unabhängig von Schwankungen der Bildrate. Aus meiner Sicht sollte ich Time.deltaTime verwenden, um zu bestimmen, wie weit man sich bei jeder Iteration von Update bewegen muss. Mein Update Code ist wie folgt:Verwirrt, warum Time.deltaTime ungleichmäßige Bewegung verursacht

void Update() 
{ 
    this.rigidBody.MovePosition(this.transform.position + new Vector3(Time.deltaTime * 2f, 0, 0)); 
} 

Allerdings bewegt sich das Objekt in schneller und langsamer Schübe, wie es über den Bildschirm bewegt. Wenn ich es während jeder Update (wie unten) eine konstante Menge verschiebe, scheint es sich gleichmäßig zu bewegen.

void Update() 
{ 
    this.rigidBody.MovePosition(this.transform.position + new Vector3(0.02f, 0, 0)); 
} 

Ich bin verwirrt, weil ich dachte, dass bei jedem Update ein Objekt einen konstanten Abstand bewegen sollte die Sache, die Jitter verursacht, da seine Geschwindigkeit durch die Framerate beeinflusst werden würde. Und ich dachte, dass die Verwendung von Time.deltaTime eine konstante Rate der frameratenunabhängigen Bewegung verursachen sollte.

Meine Time.deltaTime Werte variieren zwischen 0,002 bis 0,17, was ich auch nicht verstehe, weil ich eine sehr einfache Szene von nur 2D-Sprites habe, also verstehe ich nicht, warum die Varianz so groß ist.

Antwort

3

Wenn Sie die genaue neue Position Ihres RigidBody berechnen möchten, sollten Sie einfach die position direkt eingeben. Z.B .:

this.rigidBody.position += new Vector3(Time.deltaTime * 2f, 0, 0); 

Alternativ führen Sie den Code, den Sie bereits haben, aber in der FixedUpdate() Methode.

Die MovePosition() ist für den Einsatz im Rahmen der FixedUpdate() Methode vorgesehen. Unity3d versucht, eine Bewegungsrate gemäß der Bildrate zu berechnen, die Positionen zwischen der aktuellen Position und der neuen Position interpoliert. Sie verwirren es, indem Sie auch diese Interpolation durchführen und das Ergebnis verwenden, wenn Sie MovePosition() aufrufen.

+0

Danke. Ich habe nicht bemerkt, dass MovePosition eine eigene Interpolation durchführt. Ich dachte, es hätte das Objekt sofort in eine Position gebracht. –

Verwandte Themen