# Problem with vehicle script

when I play the game the wheels of the vehicle de attach and move away from the vehicle I do not know what I am doing wrong here is the vehicle and wheel collider script
// ----------- CAR TUTORIAL-----------------

``````// These variables allow the script to power the wheels of the car.
var FrontLeftWheel : WheelCollider;
var FrontRightWheel : WheelCollider;

// These variables are for the gears, the array is the list of ratios. The script
// uses the defined gear ratios to determine how much torque to apply to the wheels.
var GearRatio : float[];
var CurrentGear : int = 0;

// These variables are just for applying torque to the wheels and shifting gears.
// using the defined Max and Min Engine RPM, the script can determine what gear the
// car needs to be in.
var EngineTorque : float = 230.0;
var MaxEngineRPM : float = 3000.0;
var MinEngineRPM : float = 1000.0;
private var EngineRPM : float = 0.0;

function Start () {
// I usually alter the center of mass to make the car more stable. I'ts less likely to flip this way.
rigidbody.centerOfMass += Vector3(0, -.75, .25);
}

function Update () {

// Compute the engine RPM based on the average RPM of the two wheels, then call the shift gear function
EngineRPM = (FrontLeftWheel.rpm + FrontRightWheel.rpm)/2 * GearRatio[CurrentGear];
ShiftGears();

// set the audio pitch to the percentage of RPM to the maximum RPM plus one, this makes the sound play
// up to twice it's pitch, where it will suddenly drop when it switches gears.
audio.pitch = Mathf.Abs(EngineRPM / MaxEngineRPM) + 1.0 ;
// this line is just to ensure that the pitch does not reach a value higher than is desired.
if ( audio.pitch > 2.0 ) {
audio.pitch = 2.0;
}

// finally, apply the values to the wheels.	The torque applied is divided by the current gear, and
// multiplied by the user input variable.
FrontLeftWheel.motorTorque = EngineTorque / GearRatio[CurrentGear] * Input.GetAxis("Vertical");
FrontRightWheel.motorTorque = EngineTorque / GearRatio[CurrentGear] * Input.GetAxis("Vertical");

// the steer angle is an arbitrary value multiplied by the user input.
FrontLeftWheel.steerAngle = 10 * Input.GetAxis("Horizontal");
FrontRightWheel.steerAngle = 10 * Input.GetAxis("Horizontal");
}

function ShiftGears() {
// this funciton shifts the gears of the vehcile, it loops through all the gears, checking which will make
// the engine RPM fall within the desired range. The gear is then set to this "appropriate" value.
if ( EngineRPM >= MaxEngineRPM ) {
var AppropriateGear : int = CurrentGear;

for ( var i = 0; i < GearRatio.length; i ++ ) {
if ( FrontLeftWheel.rpm * GearRatio *< MaxEngineRPM ) {*
``````
• `````` 		AppropriateGear = i;*
``````
• `````` 		break;*
``````
• `````` 	}*
``````
• `````` }*
``````
• `````` CurrentGear = AppropriateGear;*
``````
• }*

• if ( EngineRPM <= MinEngineRPM ) {*

• `````` AppropriateGear = CurrentGear;*
``````
• `````` for ( var j = GearRatio.length-1; j >= 0; j -- ) {*
``````

_ if ( FrontLeftWheel.rpm * GearRatio[j] > MinEngineRPM ) {_

• `````` 		AppropriateGear = j;*
``````
• `````` 		break;*
``````
• `````` 	}*
``````
• `````` }*
``````
• `````` CurrentGear = AppropriateGear;*
``````
• }*
}
wheel collider script
// Define the variables used in the script, the Corresponding collider is the wheel collider at the position of
// the visible wheel, the slip prefab is the prefab instantiated when the wheels slide, the rotation value is the
// value used to rotate the wheel around it’s axel.
var CorrespondingCollider : WheelCollider;
var SlipPrefab : GameObject;
public var RotationValue : float = 0.0;
function Update () {

• // define a hit point for the raycast collision*

• var hit : RaycastHit;*

• // Find the collider’s center point, you need to do this because the center of the collider might not actually be*

• // the real position if the transform’s off.*

• var ColliderCenterPoint : Vector3 = CorrespondingCollider.transform.TransformPoint( CorrespondingCollider.center );*

• // now cast a ray out from the wheel collider’s center the distance of the suspension, if it hit something, then use the “hit”*

• // variable’s data to find where the wheel hit, if it didn’t, then se tthe wheel to be fully extended along the suspension.*

• if ( Physics.Raycast( ColliderCenterPoint, -CorrespondingCollider.transform.up, hit, CorrespondingCollider.suspensionDistance + CorrespondingCollider.radius ) ) {*
_ transform.position = hit.point + (CorrespondingCollider.transform.up * CorrespondingCollider.radius);_

• }else{*
_ transform.position = ColliderCenterPoint - (CorrespondingCollider.transform.up * CorrespondingCollider.suspensionDistance);_

• }*

• // now set the wheel rotation to the rotation of the collider combined with a new rotation value. This new value*

• // is the rotation around the axle, and the rotation from steering input.*
_ transform.rotation = CorrespondingCollider.transform.rotation * Quaternion.Euler( RotationValue, CorrespondingCollider.steerAngle, 0);_

• // increase the rotation value by the rotation speed (in degrees per second)*
_ RotationValue += CorrespondingCollider.rpm * ( 360/60 ) * Time.deltaTime;_

• // define a wheelhit object, this stores all of the data from the wheel collider and will allow us to determine*

• // the slip of the tire.*

• var CorrespondingGroundHit : WheelHit;*

• CorrespondingCollider.GetGroundHit( CorrespondingGroundHit );*

• // if the slip of the tire is greater than 2.0, and the slip prefab exists, create an instance of it on the ground at*

• // a zero rotation.*

• if ( Mathf.Abs( CorrespondingGroundHit.sidewaysSlip ) > 1.5 ) {*

• ``````  if ( SlipPrefab ) {*
``````
• ``````  	Instantiate( SlipPrefab, CorrespondingGroundHit.point, Quaternion.identity );*
``````
• ``````  }*
``````
• }*

I believe you could add a spring joint to it and set the amount of rotation allowed. But I haven’t tested it myself to see if it can spin freely once the angle is set large enough. The spring will hold it to the axel and you can set how much force will break it away from it. Which will be a cool effect if you land too hard and want the wheels to fly off. http://unity3d.com/learn/tutorials/modules/beginner/physics/joints

There is a link to the video that shows how to do them.