2017-06-13 4 views
1

Ich habe bereits vorwärts und links bewegt definiert. Wie mache ich es diagonal (links und oben)? Danke weiter.Einheit - Wie man sich diagonal bewegt

if (Input.GetKey(KeyCode.W)) 
    { 
     player.MovePosition(transform.position + transform.forward * speed * Time.deltaTime); 
    } 

    if(Input.GetKey(KeyCode.W) && Input.GetKey(KeyCode.A)) 
    { 
     ??? 
    } 

    if (Input.GetKey(KeyCode.A)) 
    { 
     player.MovePosition(transform.position - transform.right * speed * Time.deltaTime); 
    } 
+1

Keine Notwendigkeit, es zu definieren, wenn Sie W und A drücken, dann werden beide 'if's angewandt und das Objekt wird sich diagonal bewegen. – Gusman

+0

Nein. Es tut es nicht. –

+0

Debuggen Sie den Code und verifizieren Sie, ob es auf beiden IFs eintritt, sollte es genug sein. – Gusman

Antwort

6

Es ist erwähnenswert, dass Ihr aktueller Code auf eine Marotte von Rigidbody.MovePosition() aufgrund funktioniert nicht - seine Dokumentation es nicht erwähnt, aber für the 2D variant of the method, wird es erwähnt, dass

die Veränderung Ist-Position wird nur während des nächsten Physik-Updates auftreten. Wenn Sie diese Methode wiederholt aufrufen, ohne auf das nächste Physik-Update zu warten, wird der letzte Aufruf verwendet.

Obwohl also beide, wenn Aussagen würden eingegeben werden, wenn beide Tasten gedrückt werden, wird nur die MovePosition() in der letzten Kraft treten soll.

Um dies anzugehen, wäre mein Vorschlag, einen kombinierten Bewegungsvektor zu berechnen, anstatt MovePosition() sofort aufzurufen. Wenden Sie dann den Bewegungsvektor am Ende, so dass Sie nur jemals brauchen MovePosition() einmal zu nennen:

Vector3 totalMovement = Vector3.zero; 

if (Input.GetKey(KeyCode.W)) 
{ 
    totalMovement += transform.forward; 
} 
if (Input.GetKey(KeyCode.A)) 
{ 
    totalMovement -= transform.right; 
} 

// To ensure same speed on the diagonal, we ensure its magnitude here instead of earlier 
player.MovePosition(transform.position + totalMovement.normalized * speed * Time.deltaTime); 

hoffe, das hilft! Lass es mich wissen, wenn du irgendwelche Fragen hast.

+0

Vielen Dank! Das hat mein Problem gelöst. Ich habe auch für die linke und rechte Bewegung eine Rotationsbewegung hinzugefügt, so dass der Spieler sich drehen kann. –

+0

Großartig! Ich bin froh, dass ich helfen konnte. – Serlite

1

Wenn Sie wirklich auf Ihre aktuelle Struktur halten wollen, dann ist es das, was Sie brauchen:

if(Input.GetKey(KeyCode.W) && Input.GetKey(KeyCode.A)) 
{ 
    player.MovePosition(transform.position + (transform.forward - transform.right).normalized * speed * Time.deltaTime); 
} 

Vektoraddition in Unity unterstützt wird, so dass Sie sie einfach zusammen summieren. Sie müssen auch sicherstellen, dass nach dem Aufruf dieser if-Anweisung keine der anderen eine Überprüfung durchführen kann.

Ich würde jedoch vorschlagen, http://answers.unity3d.com/questions/566046/diagonal-movement.html für eine sauberere Lösung zu betrachten. Gusman hat Recht, es gibt Möglichkeiten, dies zu tun, ohne jeden Fall explizit zu definieren.