Jump to content
Unity Insider Forum

Max Geschwindigkeit mit WheelCollider


Heppy

Recommended Posts

Moin moin,

ich hab mich jetzt schon seit tagen durch diverse seiten gelesen verschiedene skripte angesehen usw aber ich komme auf keinen grünen ast. Hoffe ihr könnt mir hier bei dem eigentlich so einfachen problem helfen.

Also ich hab ein auto eingefügt und es mit den nötigen box sowie wheelcollidern versehen, ich kann es per skript auf die eingaben der tastertur reagieren lassen. jedoch was einfach nicht gelingen will ist das ich dem auto eine höchst Geschwindigkeit verpasse....

wenn das auto ne bestimmte geschwindigkeit bereits erreicht hat und ich dann noch beschleunige geht es wunderbar wenn ich jedoch aus dem stand heraus einfach nur beschleunige überschreitet die aktuelle geschwindigkeit die höchst geschwindigkeit bei weitem ca 10 bis 80 kmh.

void Bewegen() {
		geschwindigkeitAktuell = transform.InverseTransformDirection (Auto.velocity).z * 3.6f;
		//geschwindigkeitAktuell = Mathf.Round (2*22/7*reifenCol[0].radius*reifenCol[0].rpm*60/1000);

		if (geschwindigkeitAktuell < geschwindigkeitMaxVorwärts && Input.GetAxis ("Vertical") != 0) {
			//if (geschwindigkeitAktuell > geschwindigkeitMaxVorwärts) {
			//	Auto.drag = 10;
			//} else {
			//	Auto.drag = 0;
			//}
			var drehmoment = maxDrehmoment * Input.GetAxis ("Vertical");
			var geschFaktor = geschwindigkeitAktuell / geschwindigkeitMaxVorwärts;
			var t = drehmoment * geschFaktor;
			var dreh = drehmoment - t;

			if (antriebsArt == 1) { // Frond Antrieb
				reifenCol [0].motorTorque = dreh;
				reifenCol [1].motorTorque = dreh;
				reifenCol [2].motorTorque = 0;
				reifenCol [3].motorTorque = 0;
				reifenCol [0].brakeTorque = 0;
				reifenCol [1].brakeTorque = 0;
				reifenCol [2].brakeTorque = 0;
				reifenCol [3].brakeTorque = 0;
			} else if (antriebsArt == 2) { // Hack Antrieb
				reifenCol [0].motorTorque = 0;
				reifenCol [1].motorTorque = 0;
				reifenCol [2].motorTorque = dreh;
				reifenCol [3].motorTorque = dreh;
				reifenCol [0].brakeTorque = 0;
				reifenCol [1].brakeTorque = 0;
				reifenCol [2].brakeTorque = 0;
				reifenCol [3].brakeTorque = 0;
			} else { // Allrad
				reifenCol [0].motorTorque = dreh;
				reifenCol [1].motorTorque = dreh;
				reifenCol [2].motorTorque = dreh;
				reifenCol [3].motorTorque = dreh;
				reifenCol [0].brakeTorque = 0;
				reifenCol [1].brakeTorque = 0;
				reifenCol [2].brakeTorque = 0;
				reifenCol [3].brakeTorque = 0;
			}
		} else {
			reifenCol [0].motorTorque = 0;
			reifenCol [1].motorTorque = 0;
			reifenCol [2].motorTorque = 0;
			reifenCol [3].motorTorque = 0;

		}
	}

Habe bereits verschiedene ansätze probiert, welche ich hier und da aufschnappen konnte aber leider ohne bisherigen erfolg.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Bestimme die Geschwindigkeit des Autos anhand der Velocity (magnitude) des Rigidbodies des Boxcolliders. Sollte die Velocity (und damit auch die Geschwindigkeit) einen bestimmten Wert überschreiten, dann setzt du die Velocity des RBs neu mit einer vorher definierten maximalen Velocity. Die Messungen und das Neusetzen der Velocity werden in der FixedUpdate-Methode vorgenommen. Zum Hintergrund, die Velocity des RB des Boxcolliders wird auf den Drehimplus der Wheelcollider übernommen.

Hier noch ein kleiner Codeschnipsel aus einem anderen Projekt:

public float maxSpeed = 20.0f;


public void FixedUpdate()
{
...    
 if (bikeRigidbody.velocity.magnitude > maxSpeed)
 {
    Vector3 velocity = bikeRigidbody.velocity;
    velocity.Normalize();
    Vector3 maxVelocity = velocity * maxSpeed;
    bikeRigidbody.velocity = maxVelocity;
  }
...
}

Man kann das Ganze auch noch nur auf die Vorwärtsbeschleunigung (transform.forward) beschränken, aber ich denke es genügt auch so und damit darf das Auto auch wenn es beispielsweise zur Seite ausbricht nicht schneller werden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke funktioniert wunderbar, ich hatte dein Codebeispiel zuerst nicht gesehen (ka warum).

daher habe ich mich selbst versucht und nach vergleich des Ergebnisses keinen unterschied bemerken können.

if (geschwindigkeitAktuell > geschwindigkeitMaxVorwärts) {
	Auto.velocity = Auto.velocity.normalized * (geschwindigkeitMaxVorwärts / 3.6f);
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...