2016-11-12 1 views
0

Ich möchte ein Objekt langsam von seiner ursprünglichen Position in eine etwas höhere Position bewegen, aber dieser Code bewegt das Objekt sofort in die höchste Position, auch wenn ich eine sehr langsame Geschwindigkeit wie 0,0001 verwende f. Ich rufe LiftObj() innerhalb eines anderen Codes nur 1 Mal und ich sage es laufen, bis es den LiftOffset erreicht. Was ist falsch an diesem Code?Objekt bewegt sich sofort in eine neue Position auch bei sehr niedriger Geschwindigkeit

void LiftObj(GameObject Obj) { 

    float origianlPos = Obj.transform.position.y; 
    while (Obj.transform.position.y < origianlPos + liftOffset) { 
     Obj.transform.position += Vector3.up * 0.0001f; 
     float newPos = Obj.transform.position.y; 
     newPos = Mathf.Clamp (newPos, newPos, newPos + liftOffset); 
     Obj.transform.position += Vector3.up * 0.0001f; 
    } 
+0

Offensichtlich um Hilfe zu bitten bedeutet, dass ich kein Experte für C# oder Unity bin. Es wäre viel besser, anstatt darauf hinzuweisen, dass ich Ihnen keinen besseren Code vorschlage als meinen. – CarloCupp

Antwort

1

aber dieser Code verschiebt das Objekt sofort in die höchste Position sogar , wenn ich wie 0.0001f wirklich langsamer Geschwindigkeit verwenden.

Sie warten nicht auf alles. Die while-Schleife wird so schnell wie möglich ausgeführt, unabhängig davon, wie niedrig Ihre Variable ist. Sie sollten dies in einer Coroutine-Funktion tun und dann mit dem Schlüsselwort yieldyield return null warten.

IEnumerator LiftObj(GameObject Obj) 
{ 

    float origianlPos = Obj.transform.position.y; 
    while (Obj.transform.position.y < origianlPos + liftOffset) 
    { 
     Obj.transform.position += Vector3.up * 0.0001f; 
     float newPos = Obj.transform.position.y; 
     newPos = Mathf.Clamp(newPos, newPos, newPos + liftOffset); 
     Obj.transform.position += Vector3.up * 0.0001f; 
     yield return null; 
    } 
    Debug.Log("Done Moving Up!"); 
} 

dann bewegen sich mit:

StartCoroutine(LiftObj(myGameObject)); 

nicht einmal sicher, ob das funktionieren würde, wie erwartet, weil Sie Time.delta so die Bewegung fehlen darf nicht glatt sein. Wenn alles, was Sie tun wollen, ist Bewegung von einer Position in eine andere Überstunden, verwenden Sie den folgenden Beispielcode:

IEnumerator LiftObj(GameObject playerToMove, Vector3 toPoint, float byTime) 
{ 
    Vector3 fromPoint = playerToMove.transform.position; 

    float counter = 0; 

    while (counter < byTime) 
    { 
     counter += Time.deltaTime; 
     playerToMove.transform.position = Vector3.Lerp(fromPoint, toPoint, counter/byTime); 
     yield return null; 
    } 
} 

Verschieben von aktuellen myGameObject Position Vector3(0, 5, 0) in 4 Sekunden:

StartCoroutine(LiftObj(myGameObject, new Vector3(0, 5, 0), 4)); 
+0

Ihr erster Code funktioniert gut, ich habe eine niedrige Geschwindigkeit als Beispiel verwendet, um zu überprüfen, ob es funktioniert. Ich benutze jetzt liftSpeed ​​* Time.deltaTime – CarloCupp

+0

Awesome. Habe diesem Code-Bug nicht gut geglaubt. – Programmer

0

Sie verwenden eine While-Schleife an einem falschen Ort hier.

While-Schleifen werden weiterhin in einem Frame ausgeführt, solange die Anweisung wahr ist. Dies bedeutet, dass unabhängig davon, wie niedrig Ihr Magnitudenmultiplikator ist (0,001f), es nur mehr Iterationen mit demselben Frame benötigt, um das Ziel zu erreichen.

Sie sollten überprüfen, ob jedes Frame das Ziel bereits erreicht hat und ob die Transformation nicht angewendet wurde.

Verwandte Themen