Skip to content

Instantly share code, notes, and snippets.

@victorbstan
Last active September 11, 2023 05:29
Show Gist options
  • Save victorbstan/e5903829576eaf6ce5e3 to your computer and use it in GitHub Desktop.
Save victorbstan/e5903829576eaf6ce5e3 to your computer and use it in GitHub Desktop.
Unity car simulation script
using UnityEngine;
using System.Collections;
public class CarControl : MonoBehaviour {
// NOTE: Companion script for wheel suspensions, attach to each wheel.
// https://gist.github.com/victorbstan/4dde0d0b4203c248423e
// PUBLIC
public bool driveable = false;
// Wheel Wrapping Objects
public Transform frontLeftWheelWrapper;
public Transform frontRightWheelWrapper;
public Transform rearLeftWheelWrapper;
public Transform rearRightWheelWrapper;
// Wheel Meshes
// Front
public Transform frontLeftWheelMesh;
public Transform frontRightWheelMesh;
// Rear
public Transform rearLeftWheelMesh;
public Transform rearRightWheelMesh;
// Wheel Colliders
// Front
public WheelCollider wheelFL;
public WheelCollider wheelFR;
// Rear
public WheelCollider wheelRL;
public WheelCollider wheelRR;
public float maxTorque = 20f;
public float brakeTorque = 100f;
// max wheel turn angle;
public float maxWheelTurnAngle = 30f; // degrees
// car's center of mass
public Vector3 centerOfMass = new Vector3(0f, 0f, 0f); // unchanged
// GUI
//...
public float RO_speed; // READ ONLY (Debug)
public float RO_EngineTorque; // READ ONLY (Debug)
public float RO_SteeringAngleFL; // READ ONLY (Debug)
public float RO_SteeringAngleFR; // READ ONLY (Debug)
public float RO_BrakeTorque; // READ ONLY (Debug)
// PRIVATE
// acceleration increment counter
private float torquePower = 0f;
// turn increment counter
private float steerAngle = 0f;
// original wheel positions
// Front Left
private float wheelMeshWrapperFLx;
private float wheelMeshWrapperFLy;
private float wheelMeshWrapperFLz;
// Front Right
private float wheelMeshWrapperFRx;
private float wheelMeshWrapperFRy;
private float wheelMeshWrapperFRz;
// Rear Left
private float wheelMeshWrapperRLx;
private float wheelMeshWrapperRLy;
private float wheelMeshWrapperRLz;
// Rear Right
private float wheelMeshWrapperRRx;
private float wheelMeshWrapperRRy;
private float wheelMeshWrapperRRz;
void Start () {
rigidbody.centerOfMass = centerOfMass;
// Setup initial values
// Front Left
// wheelMeshWrapperFLx = frontLeftWheelWrapper.localPosition.x;
// wheelMeshWrapperFLy = frontLeftWheelWrapper.localPosition.y;
// wheelMeshWrapperFLz = frontLeftWheelWrapper.localPosition.z;
// Front Right
// wheelMeshWrapperFRx = frontRightWheelWrapper.localPosition.x;
// wheelMeshWrapperFRy = frontRightWheelWrapper.localPosition.y;
// wheelMeshWrapperFRz = frontRightWheelWrapper.localPosition.z;
// Rear Left
// wheelMeshWrapperRLx = rearLeftWheelWrapper.localPosition.x;
// wheelMeshWrapperRLy = rearLeftWheelWrapper.localPosition.y;
// wheelMeshWrapperRLz = rearLeftWheelWrapper.localPosition.z;
// Rear Right
// wheelMeshWrapperRRx = rearRightWheelWrapper.localPosition.x;
// wheelMeshWrapperRRy = rearRightWheelWrapper.localPosition.y;
// wheelMeshWrapperRRz = rearRightWheelWrapper.localPosition.z;
}
// Visual updates
void Update () {
if (! driveable) {
return;
}
// SETUP WHEEL MESHES
// Turn the mesh wheels
frontLeftWheelWrapper.localEulerAngles = new Vector3(0, steerAngle, 0);
frontRightWheelWrapper.localEulerAngles = new Vector3(0, steerAngle, 0);
// Wheel rotation
frontLeftWheelMesh.Rotate(0, wheelFL.rpm / 60 * 360 * Time.deltaTime, 0);
frontRightWheelMesh.Rotate(0, wheelFR.rpm / 60 * 360 * Time.deltaTime, 0);
rearLeftWheelMesh.Rotate(0, wheelRL.rpm / 60 * 360 * Time.deltaTime, 0);
rearRightWheelMesh.Rotate(0, wheelRR.rpm / 60 * 360 * Time.deltaTime, 0);
// Audio
audio.pitch = (torquePower / maxTorque) + 0.5f;
}
// Physics updates
void FixedUpdate () {
if (! driveable) {
return;
}
// CONTROLS - FORWARD & RearWARD
if ( Input.GetKey(KeyCode.Space) ) {
// BRAKE
torquePower = 0f;
wheelRL.brakeTorque = brakeTorque;
wheelRR.brakeTorque = brakeTorque;
} else {
// SPEED
torquePower = maxTorque * Mathf.Clamp( Input.GetAxis("Vertical"), -1, 1 );
wheelRL.brakeTorque = 0f;
wheelRR.brakeTorque = 0f;
}
// Apply torque
wheelRR.motorTorque = torquePower;
wheelRL.motorTorque = torquePower;
// Debug.Log(Input.GetAxis("Vertical"));
Debug.Log("torquePower: " + torquePower);
Debug.Log("brakeTorque RL: " + wheelRL.brakeTorque);
Debug.Log("brakeTorque RR: " + wheelRR.brakeTorque);
Debug.Log("steerAngle: " + steerAngle);
// CONTROLS - LEFT & RIGHT
// apply steering to front wheels
steerAngle = maxWheelTurnAngle * Input.GetAxis("Horizontal");
wheelFL.steerAngle = steerAngle;
wheelFR.steerAngle = steerAngle;
// Debug info
RO_BrakeTorque = wheelRL.brakeTorque;
RO_SteeringAngleFL = wheelFL.steerAngle;
RO_SteeringAngleFR = wheelFR.steerAngle;
RO_EngineTorque = torquePower;
// SPEED
// debug info
RO_speed = rigidbody.velocity.magnitude;
// KEYBOARD INPUT
// FORWARD
if ( Input.GetKey(KeyCode.W) ) {
// Debug.Log("FORWARD");
}
// BACKWARD
if ( Input.GetKey(KeyCode.S) ) {
// Debug.Log("BACKWARD");
}
// LEFT
if ( Input.GetKey(KeyCode.A) ) {
// Debug.Log("LEFT");
}
// RIGHT
if ( Input.GetKey(KeyCode.D) ) {
// Debug.Log("RIGHT");
}
// BRAKE
if ( Input.GetKey(KeyCode.Space) ) {
// Debug.Log("SPACE");
}
}
}
@talhakaraer
Copy link

how can i increase speed ? please how can fast my car?

@elieM96
Copy link

elieM96 commented Jun 1, 2020

how can i increase speed ? please how can fast my car?

just increase the maxTorque value

@Kinox7
Copy link

Kinox7 commented Aug 31, 2020

what does "wheel wrapper" refers to???
I cant get it.

@jRayShumway00
Copy link

It works well, but I have a few questions:

  • What do you mean by "// DISPLAY ONLY"
  • What do you mean by "Wheel Wrapper"?
  • Why does my wheel rotate on the Y-Axis rather than the X-Axis?
  • What does the prefix "RO_" mean in the variables for the "// DISPLAY ONLY" Variables mean?

Answering these questions can help me understand the script better.

@TNT-333
Copy link

TNT-333 commented Nov 7, 2020

Could someone help me my car is not moving at all! I've already done everything I know that might fix this but nothing worked. I use Unity 2020.2.0b4.3200 Personal. (I am a beginner)

Here's a video: https://drive.google.com/file/d/1FKPA-qcuYs8fMXzmL_C8oLH4skfyawlx/view?usp=sharing

@KarloRomic
Copy link

Could someone help me my car is not moving at all! I've already done everything I know that might fix this but nothing worked. I use Unity 2020.2.0b4.3200 Personal. (I am a beginner)

Here's a video: https://drive.google.com/file/d/1FKPA-qcuYs8fMXzmL_C8oLH4skfyawlx/view?usp=sharing

Put every wheel FL, FR, RL, RR in it's separate wrappers (Create 4 empty game objects and put one wheel in each one of those empty objects as a child), then add Wheel Collider component to the parents of the each wheel (wheel wrapper), and then link them correctly in the Car Control script in the editor of the Car. Also put some mass on the car itself (root of the car/main parrent), something like 1500 (i use it as Kilograms), and then increase the maxTorque of the engine in the editor to get car moving with that mass. Car should move then. Then it's just fine tunning suspension, traction, drag of the wheels, car itself and CarControl script component of the car. I hope it helped. :)

@Andrew98-cyber
Copy link

how to increase the speed when turning? as fast as when moving forward

@KarloRomic
Copy link

how to increase the speed when turning? as fast as when moving forward

If you mean steering wheel (and wheels) then change
public float maxWheelTurnAngle = 30f; // degrees
If you mean response time, then i would recommend putting all of the if statements that check for keypresses
Input.GetKey(KeyCode.W) to the Update function so that you catch every key press precisely at time.
If you mean steering with more grip (faster steering) and less sliding, then try this wheel configurations for every wheel colider:
Forward friction: 2, 5, 5, 2, 1
Also try changing values of the Sideways friction and see the results, try playing with the Sideways friction setting on your wheel coliders, the best way to do it is while you are in play mode.

@Charmscobb
Copy link

My car gets sent flying into the air, how do i fix this?

@RJAmoto
Copy link

RJAmoto commented Sep 21, 2021

I want to change the controls to a screen button, how can I convert this to a button input, for example I press gas button and it will move forward, what function makes it move forward when w is pressed and what function makes it go left and right when a and d is pressed, the getKeycode function has nothing inside...

@RagaSaga
Copy link

Hello everyone! I don't know why I am getting the following issue whenever I am entering play mode after assigning the scrip to my car: -
" ArgumentNullException: Value cannot be null.
Parameter name: source UnityEngine.AudioSource.set_pitch (System.Single value) (at <7117d168a9ec4e518e0de7d9c98bd09a>:0)
CarMovement.Update () (at Assets/Scripts/CarMovement.cs:125) "

I cannot find any fix for it (I am a beginner). I have assigned the desired objects to every variable slot. Please Help.
Just to be informed I am using this ( https://assetstore.unity.com/packages/3d/vehicles/land/free-sci-fi-car-184607 ) car for my project and have assigned the wheel colliders to its wheels.

Please Help.

@Erwin-afk
Copy link

My car gets sent flying into the air, how do i fix this?

Add rigidbody to it.

@NithinBODDU
Copy link

What do you mean by "Wheel Wrapper"?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment