2016-04-04 8 views
0

Ich habe diese IEnumerator, um meinen Spieler an einen bestimmten Ort auf einem Spielbrett Kachel zu bewegen, nachdem er dieses Kachel erreicht hat. Hier ist der Code, es ist wirklich einfach.Jerky Lerp Bewegung

IEnumerator LerpToPlayerSpot(Vector3 newPosition, float time) 
    { 
     float elapsedTime = 0; 
     Vector3 startingPos = transform.position; 
getInPosFlag = true; 
     while (elapsedTime < time) 
     { 
      transform.position = Vector3.Lerp(startingPos, newPosition, (elapsedTime/time)); 
      elapsedTime += Time.deltaTime; 
      yield return null; 
     } 

    } 

Das Problem, das ich habe, ist, dass nach der richtigen Position erreicht die Spieler ein wenig zu Ruck um scheinen, bevor sie in Platz nieder. Ich erinnere mich daran, das in einem anderen Projekt zu beheben, indem ich meine eigene Approximation implementierte, aber ich frage mich, ob es eine bessere Lösung gibt.

Bearbeiten. Ich habe es repariert. Die getInPosFlag sollte vor der While-Schleife gesetzt werden. weil ich es nach der while-schleife eingestellt habe, wurde die co-routine noch ein oder zwei mal aufgerufen, als es nötig war.

Antwort

0

ändern

(elapsedTime/time) 

zu

Math.Min((elapsedTime/time), 1) 

wenn es der Zeit ist kein Time.deltaTime mehr (Zeit% Time.deltaTime! = 0), dann sind Sie die Lerp Reichweite größer als (0, 1).

Mit Math.Min beschränken Sie die Ausgabe auf eins.

+0

Danke. Math.Min tat nichts für mich, aber ich hatte vergessen, den Parameter zu multiplizieren, die ich an die Co-Routine von Time.deltaTime übergeben –

+0

nach weiteren Tests die ruckartige Bewegung ist immer noch da, die Idioten sind nicht weniger prominent. –

+0

Können Sie "ruckartig" definieren? es scheitert am Ende? dazwischen? – Gusman