2017-09-07 2 views
3

Ich bin neu in Unity und Starrkörper, und ich dachte, ich würde lernen, indem ich versuche, ein 3D Tron Light-Cycle-Spiel zu machen.Einheit - Mit einem Starrkörper für Motorrad - wie drehe ich mich?

enter image description here

I verwendet, auf dem langgestreckten Bereich einen starren Körper, und verwendet, um den folgenden Code:: Ich habe meine Spieler Fahrzeug eine Kombination von Zylindern, Kugeln und Rechtecke verwendet wird, unten gesehen

public float accel = 1.0f;  
// Use this for initialization 
void Start() { 
    cycleSphere = GetComponent<Rigidbody>(); 
} 

void FixedUpdate() { 
    cycleSphere.velocity = Vector3.forward * accel; 
} 

Das bewegt das Fahrzeug vorwärts. Ich bin mir nicht sicher, ob es einen besseren Weg gibt, dies zu tun, aber wenn es so ist, sag es bitte.

Ich habe die Hauptkamera an das Fahrzeug angeschlossen, und X-Drehung deaktiviert, um zu verhindern, dass es und die Kamera rollen.

Jetzt möchte ich es durch Drücken der Tasten A und D drehen. Im Gegensatz zu der 90-Grad-Drehung der ursprünglichen Tron-Lichtzyklen wollte ich, dass sie sich wie ein normales Fahrzeug dreht.

So habe ich versucht, dies:

void Update() { 
    if (Input.GetKey (KeyCode.A)) { 
     turning = true; 
     turnAnglePerFixedUpdate -= turnRateAngle; 
    } else if (Input.GetKey (KeyCode.D)) { 
     turning = true; 
     turnAnglePerFixedUpdate += turnRateAngle; 
    } else { 
     turning = false; 
    } 
} 

void FixedUpdate() { 
    float mag = cycleSphere.velocity.magnitude; 
    if (!turning) { 
     Quaternion quat = Quaternion.AngleAxis (turnAnglePerFixedUpdate, transform.up);// * transform.rotation; 
     cycleSphere.MoveRotation (quat); 
    } 
    cycleSphere.velocity = Vector3.forward * accel; 
} 

Während der obige Code das Fahrzeug dreht, bewegt er sich immer noch in der letzten Richtung es war - es eher wie ein Panzerturm verhält. Schlimmer noch, wenn man entweder A oder D zu sehr drückt, würde es sich in die gewünschte Richtung drehen und nach einer kurzen Weile verrückt werden, sich in diese Richtung drehen und die Kamera mitnehmen.

enter image description here

Was habe ich falsch gemacht, und wie kann ich es beheben?

Antwort

3

Als Erstes würde ich Ihnen empfehlen, von Input.GetKey zu Input.GetAxis zu wechseln, was den Wert der Taste beim Drücken der Taste erhöht oder verringert. Dies gibt Ihnen die Möglichkeit, den Kraftvektor, der als Geschwindigkeit angewendet wird, zu normalisieren. Dann müssen Sie basierend auf diesem Vektor Ihre Krafteingabe anpassen, so dass das "Vorderrad" den Rest des Körpers in eine andere Richtung (links oder rechts) "schleppen" wird. Dies ist nicht das ideale "physikalische Verhalten der realen Welt", weil die Vorwärtskraft etwas größer ist als die Seitenkraft (links oder rechts).

Codebeispiel:

// member fields 
float sideForceMultiplier = 1.0f; 
float frontForceMultiplier = 2.0f; 
Vector3 currentVeloticy = Vector3.zero; 

void Update() 
{ 
    Vector3 sideForce = (sideForceMultiplier * Input.GetAxis("horizontal")) * Vector3.right; 
    Vector3 frontForce = frontForceMultiplier * Vector3.forward; 
    currentVelocity = (sideForce + fronForce).Normalize; 
} 

void FxedUpdate() 
{ 
    cycleSphere.velocity = currentVelocity * accel; 
} 
+0

Hmm, interessant. Ich habe seitdem einige Änderungen an meinem Code vorgenommen, und ich habe es funktioniert, aber ich habe Ihren Ratschlag übernommen und den getKey auf Input gesetzt. Wie dreht sich dieser Code? –

+0

Dieser Code bezieht sich auf den Wert, der von 'Input.GetAxis (" horizontal ")" abgerufen wird, das mit dem '2 * forwardForce" kombiniert wird. Das bedeutet, dass es weitergehen wird, aber wenn es einen horizontalen Eingang gibt, verändert es die Kraft (macht es etwas gekrümmt). –

Verwandte Themen