2016-05-01 14 views
1

Ich mache ein Bewegungsskript mit Vektor 2 und Rigidbody.velocity. Ich möchte, dass sich mein Spielobjekt bis zu einer bestimmten x-Position bewegt und dann zur ursprünglichen Position zurückkehrt, während ich mich kontinuierlich fortbewege. Ich erreichte den ersten Teil, es geht nach hinten, wenn es einen bestimmten Punkt erreicht, aber dann die Rückwärtsbewegung hört nie auf:Einheit C# Vektor 2 Bewegungsprobleme

edit:

public float spawnPos; 
public float currentPos; 
public float constantSpeed = 3; 
public float speed = 0; 
KeyInput scriptBeholderKI; 
Rigidbody2D squadRigidBody; 

//Comprovation of spawnposition and KeyInput 
//Script adquisition 
void Start() { 

    spawnPos = transform.position.x; 
    scriptBeholderKI = gameObject.GetComponent <KeyInput>(); 
    squadRigidBody = gameObject.GetComponent <Rigidbody2D>(); 

} 

void FixedUpdate() { 

    //Movement 
    squadRigidBody.velocity = new Vector2 (constantSpeed + speed , 0); 

    //key inputs 
    if (Input.GetKeyDown (scriptBeholderKI.forward)) { 

     StopAllCoroutines(); 
     StartCoroutine (RightMovement(0f)); 
    } 

    if (Input.GetKeyDown (scriptBeholderKI.backwards)) { 

     StopAllCoroutines(); 
     StartCoroutine (LeftMovement (0f)); 
    } 
} 

//Speed values (Right, Left) 
IEnumerator RightMovement (float Rloop) { 

    while (transform.position.x < constantSpeed * Time.time + spawnPos + 14) { 

     speed = 10f; 
     yield return new WaitForSeconds (Rloop); 
    } 

    if (transform.position.x> constantSpeed * Time.time + spawnPos + 14) { 

     StopAllCoroutines(); 
     StartCoroutine (LeftMovement (0f)); 
    } 
} 

IEnumerator LeftMovement (float Lloop) { 

    while (transform.position.x > constantSpeed * Time.time + spawnPos) { 

     speed = -7f; 
     yield return new WaitForSeconds (Lloop); 
    } 
} 

Wenn Sie auch etwas sehen, die pls verbessert werden könnte mir c machen beachten :

Wenn ich die Vorwärtseingabe drücke, bewegt sich mein Spielobjekt, bis es einen Punkt erreicht, wenn ich die bacwards eindrücke, bewegt es sich nonstop nach links.

ist auch die Sache, dass ich möchte, dass sich mein Ziel mit der konstanten Geschwindigkeit des Spielobjekts bewegt, deshalb verwende ich Time.time. die Bewegungen, die ich mit den Eingängen mache, sind genauer gesagt die Beschleunigungen. Ich möchte, dass mein Ziel immer in der gleichen relativen Entfernung vom Spielobjekt ist, da das Spiel beginnt. Zumindest die maximale Reichweite nach rechts ist die, die ich will ...

Und ich habe auch versucht, den Stop alle Coroutinen Block und nichts zu entfernen, ich aber meine Absicht war es, in der Lage sein, die Bewegung abzubrechen, wann immer ich will (Ich entfernte das in der RightMovement-Coroutine, aber es war nicht notwendig)

eine letzte Sache: Ich habe "FixedUpdate" für "Update" geändert, weil es mir Probleme mit meinen Eingaben gab, tue ich nicht wissen, ob es relevant ist, aber nur für den Fall.

+0

id sagen das tut nicht, was du denkst, es tut 'transform.position.x "(Time.time is) Die Zeit zu Beginn dieses Frames (Read Only). Dies ist die Zeit in Sekunden ** seit Beginn des Spiels **." Stattdessen, wenn Sie anfangen zu bewegen, berechnen Sie Ihr Ziel, speichern Sie es und überprüfen Sie gegen diese Position, wenn Sie sich umdrehen, das gleiche tun. – yes

+0

Ich kann schon alles sehen, was sich ändern sollte.Können Sie Ihre Frage bearbeiten und hinzufügen, was passiert, wenn die Vorwärts-Taste gedrückt wird und was passiert, wenn die Rückwärts-Taste gedrückt wird. – Programmer

+0

Warum erstellen Sie nicht einfach eine "Movement" -Funktion und geben "float" oder "-float" ein, je nachdem, auf welche Art Sie sich bewegen möchten? Wie es aussieht, ist die Strecke, die du reisen willst, fix ... (oder ein bool, zum Beispiel wenn (doMoveLeft) mvSpeed ​​* = -1; [Bewegungscode])? Haben Sie auch versucht, den in Ihrem "while" -Ausdruck ausgewerteten Wert zu debuggen? Was lässt Dich denken, dass LeftMov ... aufhört, wenn es den Block "StopAllCorutines" nicht gibt? –

Antwort

0

Ich denke, Sie verwechseln die Time.time Variable. Genau wie yes in seinem Kommentar erwähnt

Time.time ist die Zeit in Sekunden seit dem Start des Spiels.

Dies bedeutet, mit der Zeit wird auch Ihr Ziel, die langsam, aber sicher weg bewegen wird.

Statt Time.time könnten Sie jedoch verwenden Time.deltaTime

Time.deltaTime die Zeit in Sekunden ist es dauerte das letzte Bild zu vervollständigen

Dies wird am häufigsten für die Bewegung verwendet.

Wenn Sie mit Time.deltaTime multiplizieren äußern Sie im Wesentlichen: I pro Sekunde dieses Objekt 10 Meter bewegen wollen anstelle von 10 Metern pro Rahmen, wenn die Multiplikation 10.

Unity docs: Time.deltaTime