My vehicle in Unity has a problem: it slightly steers on the right, on its own. And it's very strange, since all the WheelColliders are perfectly alligned and propelled with the same torque value. The only difference between the wheels is that rear wheels are bigger than front ones (my vehicle is a Kart), but they are perfectly mirrored. I tried to add some kind of hardcode correction, but I removed it because the problem persised, just behaving a bit differently. I hope it's not a bug... Anyway, I attached the code that moves the kart so you can check. Also, do you think this code is slow?
//CARATTERISTICHE DEL VEICOLO
/*Accelerazione*/ var maxtorque = 85.0;
/*Velocit*/ var maxspeed = 1.3;
/*Sterzata*/ var maxsteer = 15.0;
/*Frenata*/ var brakepower = 100.0;
//VALORI DI SISTEMA
/*Marcia iniziale*/ private var currentgear = 0;
/*Sterzata temporanea*/ private var tempsteer = 0.0;
/*Moltiplicatore sterzata*/ private var easysteer = 1.3;
/*Abbassa baricentro*/ rigidbody.centerOfMass = Vector3(0,-0.3,0);
//VALORI DI MOVIMENTO
/*Accelerazione finale*/ private var endTorque = 0.0;
/*Frenata finale*/ private var endBrake = 0.0;
/*Sterzata finale*/ private var endSteer = 0.0;
//DEFINISCI COLLIDER DELLE RUOTE
var Coll_FrSX = transform ;
var Coll_FrDX = transform ;
var Coll_ReSX = transform ;
var Coll_ReDX = transform ;
function FixedUpdate () {
//CAMBIA IL DRAG SE SI E' A TERRA O IN ARIA
if (Coll_ReDX.collider.isGrounded == true && Coll_ReSX.collider.isGrounded == true)
rigidbody.drag = 0.4;
if (Coll_ReDX.collider.isGrounded == false && Coll_ReSX.collider.isGrounded == false)
rigidbody.drag = 0.2;
//SISTEMA DEL CAMBIO
//Vai a folle
if (currentgear == 1 && Coll_ReDX.collider.rpm < 0.01 && Coll_ReDX.collider.rpm < 0.01) currentgear = 0;
if (currentgear == -1 && Coll_ReDX.collider.rpm > -0.01 && Coll_ReDX.collider.rpm > -0.01) currentgear = 0;
//Innesta la prima
if (currentgear == 0 && Input.GetAxis("Vertical") > 0.01) currentgear = 1;
//Innesta la retromarcia
if (currentgear == 0 && Input.GetAxis("Vertical") < -0.01) currentgear = -1;
//CAMBIA I VALORI DI MOVIMENTO IN BASE ALLA MARCIA
//Marcia avanti
if (currentgear == 1)
{
endTorque = Mathf.Clamp(Input.GetAxis("Vertical"),0.0,1.0)*maxtorque-((rigidbody.velocity.magnitude+rigidbody.velocity.magnitude)/maxspeed);
endBrake = Mathf.Clamp(Input.GetAxis("Vertical"),-1.0,0.0)*-brakepower;
endSteer = (tempsteer-(Mathf.Clamp((rigidbody.velocity.magnitude/easysteer)/2,0.0,tempsteer-1)))*(Input.GetAxis("Horizontal"));
}
//Marcia indietro
if (currentgear == -1)
{
endTorque = Mathf.Clamp(Input.GetAxis("Vertical"),-1.0,0.0)*60+(rigidbody.velocity.magnitude*7);
endBrake = Mathf.Clamp(Input.GetAxis("Vertical"),0.0,1.0)*brakepower;
endSteer = (tempsteer+10-(Mathf.Clamp(rigidbody.velocity.magnitude/easysteer,0.0,tempsteer-1)))*Input.GetAxis("Horizontal");
}
//Temporary code to be used before the Drifting code
Coll_ReDX.collider.sidewaysFriction.stiffness = 0.12;
Coll_ReSX.collider.sidewaysFriction.stiffness = 0.12;
Coll_FrDX.collider.sidewaysFriction.stiffness = 0.12;
Coll_FrSX.collider.sidewaysFriction.stiffness = 0.12;
tempsteer=maxsteer;
//MUOVI IL VEICOLO
//Accelerazione
Coll_ReDX.collider.motorTorque = endTorque;
Coll_ReSX.collider.motorTorque = endTorque;
//Frenata
Coll_ReDX.collider.brakeTorque = endBrake;
Coll_ReSX.collider.brakeTorque = endBrake;
//Sterzata
Coll_FrDX.collider.steerAngle = endSteer;
Coll_FrSX.collider.steerAngle = endSteer;
//ESCI DAL GIOCO
if (Input.GetKey ("escape")) {Application.Quit();}
}
//VISUALIZZA I DATI SU SCHERMO
function OnGUI(){
GUI.Label(Rect(0,0,1000,1000), "Speed: "+rigidbody.velocity.magnitude.ToString());
GUI.Label(Rect(0,20,1000,1000), "Air resistance: "+rigidbody.drag.ToString());
GUI.Label(Rect(0,40,1000,1000), "Gear: "+currentgear.ToString());
GUI.Label(Rect(0,60,1000,1000), "Render time: "+Time.deltaTime);
}