How to make brake car ?
Hi ! Its me again :D. I have a problem with my car script. I want make when I press arrow down my car slow down but when i press Space my car 'simulate handbraking' but I dont know how to make this.
In this script my car slow down but veeeery slow. Someone want to help me? Thank you for any help.
I using script from this video: https://www.youtube.com/watch?v=xQcJAa6Ooa4
Script C#:
using UnityEngine;
using System.Collections;
public class RearWheelDriveXp : MonoBehaviour
{
private WheelCollider[] wheels;
public float maxAngle = 30;
public float maxTorque = 300;
public float topSpeed = 100; // km per hour
public float currentSpeed = 0;
private float pitch = 4f;
public Transform visualCar;
public GameObject CarEngine;
// here we find all the WheelColliders down in the hierarchy
public void Start()
{
wheels = GetComponentsInChildren<WheelCollider>();
GetComponent<Rigidbody>().centerOfMass = visualCar.localPosition;
}
// this is a really simple approach to updating wheels
// here we simulate a rear wheel drive car and assume that the car is perfectly symmetric at local zero
// this helps us to figure our which wheels are front ones and which are rear
public void Update()
{
float angle = maxAngle * Input.GetAxis("Horizontal");
float torque = maxTorque * Input.GetAxis("Vertical");
foreach (WheelCollider wheel in wheels)
{
// a simple car where front wheels steer while rear ones drive
if (wheel.transform.localPosition.z > 0)
wheel.steerAngle = angle;
if (wheel.transform.localPosition.z < 0)
wheel.motorTorque = torque;
// update visual wheels if any
{
Quaternion q;
Vector3 p;
wheel.GetWorldPose(out p, out q);
// assume that the only child of the wheelcollider is the wheel shape
Transform shapeTransform = visualCar.FindChild(wheel.name);
shapeTransform.position = p;
shapeTransform.rotation = q;
}
}
// CURRENT SPEED
currentSpeed = GetComponent<Rigidbody>().velocity.magnitude;
pitch = currentSpeed / topSpeed;
CarEngine.GetComponent<AudioSource>().pitch = pitch + 0.5f;
}
public void FixedUpdate()
{
if (currentSpeed > topSpeed)
{
GetComponent<Rigidbody>().velocity = GetComponent<Rigidbody>().velocity.normalized * topSpeed;
}
}
}
for(var WC:WheelCollider in wheels)
{
WC.brakeTorque = 300; // anything of high value will do,low value will make car //gradually slow down
}
Sorry java script above.This will grab all wheels component in your wheels array and apply instant brake force.Same approach you can use to assign brake only into back wheels. Hope this helps \e/ .
Answer by DevsGoingViral · Jan 08, 2017 at 10:50 PM
Hi,you can do something like this for stopping the car:
var Brakes : float;
function Update(){
Brakes = 0;
if (Input.GetKey(KeyCode.Space) == true){
Brakes = 300;
}
for(var WC:WheelCollider in wheelcolliders){
WC.brakeTorque = Brakes;
}
}
This whole code will work.You just needed to specify in what case "brakeTourque" is 300,in this code example it is when space bar is pressed like you wanted :).In function update "Brakes = 0" will make sure you don't apply any braking power until you hit spacebar.
@mika123 Thank you soooooooo much! You're awesome! :D
Answer by Mativve · Jan 08, 2017 at 05:44 PM
@mika123 I use http://www.m2h.nl/files/js_to_c.php to convert :D but i have next problem. My car don't want go. Nothing happens. What I do wrong ?
I paste your script in Update() function. Script look that:
// here we find all the WheelColliders down in the hierarchy
public void Start()
{
wheels = GetComponentsInChildren<WheelCollider>();
GetComponent<Rigidbody>().centerOfMass = visualCar.localPosition;
}
// this is a really simple approach to updating wheels
// here we simulate a rear wheel drive car and assume that the car is perfectly symmetric at local zero
// this helps us to figure our which wheels are front ones and which are rear
public void Update()
{
float angle = maxAngle * Input.GetAxis("Horizontal");
float torque = maxTorque * Input.GetAxis("Vertical");
foreach (WheelCollider WC in wheels)
{
WC.brakeTorque = 300; // anything of high value will do,low value will make car //gradually slow down
}
foreach (WheelCollider wheel in wheels)
{
// a simple car where front wheels steer while rear ones drive
if (wheel.transform.localPosition.z > 0)
wheel.steerAngle = angle;
if (wheel.transform.localPosition.z < 0)
wheel.motorTorque = torque;
// update visual wheels if any
{
Quaternion q;
Vector3 p;
wheel.GetWorldPose(out p, out q);
// assume that the only child of the wheelcollider is the wheel shape
Transform shapeTransform = visualCar.FindChild(wheel.name);
shapeTransform.position = p;
shapeTransform.rotation = q;
}
}
if (Input.Get$$anonymous$$ey($$anonymous$$eyCode.Space) == true){
Brakes = 300;
}
else{
Brakes = 0;
}
You need to set the brakes back to 0 when player not braking anymore. As also in your code you applying brakes all the time and not when something is pressed.Sorry i didn't saw your comment earlier. :S
Your answer
Follow this Question
Related Questions
Make the car stop by hitting the wall 1 Answer
Move to next animation with clicking the game object 0 Answers
How to stop movement script on void start and resume after. 0 Answers
WaitForSeconds won't wait (Corotine),WaitForSeconds not waiting 0 Answers
Button appears when switching between scenes or quitting game 1 Answer