-
-
Save victorbstan/e5903829576eaf6ce5e3 to your computer and use it in GitHub Desktop.
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"); | |
} | |
} | |
} |
how can i increase speed ? please how can fast my car?
just increase the maxTorque value
what does "wheel wrapper" refers to???
I cant get it.
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.
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
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. :)
how to increase the speed when turning? as fast as when moving forward
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.
My car gets sent flying into the air, how do i fix this?
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...
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.
My car gets sent flying into the air, how do i fix this?
Add rigidbody to it.
What do you mean by "Wheel Wrapper"?
how can i increase speed ? please how can fast my car?