- Home /
Question by
benedictwongxr · Jul 09, 2020 at 06:11 PM ·
wheelcollidercar physics
My vehicle keep on reversing none stop even when i stop pressing S key with wheel collider.
hi i am new to unity and i have no idea how there code causes my vehicle in the game to non stop reversing when i press S key. is not entirely non stop, but it reverse for a very long time only stop. enter code here
/*
* This Script Controls the car!
*/
using System.Collections;
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class LPPV_CarController : MonoBehaviour
{
public enum WheelType
{
FrontLeft, FrontRight, RearLeft, RearRight
}
public enum SpeedUnit
{
Imperial, Metric
}
[Serializable]
class Wheel
{
public WheelCollider collider;
public GameObject mesh;
public WheelType wheelType;
}
[SerializeField] private Wheel[] wheels = new Wheel[4];
[SerializeField] private float maxTorque = 2000f, maxBrakeTorque = 500f, maxSteerAngle = 30f; //max Torque of Wheels, max Brake Torque and Maximum Steer Angle of steerable wheels
[SerializeField] private static int NoOfGears = 5;
[SerializeField] private float downForce = 100f; // The Force to apply downwards so that car stays on track!
[SerializeField] private SpeedUnit speedUnit; //Speed Unit - Imperial - Miles Per Hour, Metric - Kilometers Per Hour
[SerializeField] private float topSpeed = 140;
[SerializeField] private Transform centerOfMass;
[SerializeField] private Text speedText;
#if UNITY_ANDROID || UNITY_IOS
[SerializeField] private LPPV_VButton accelerateButton, brakeButton, handBrakeButton;
#endif
[HideInInspector] public bool Accelerating = false, Deccelerating = false, HandBrake = false;
private Rigidbody _rgbd;
public float CurrentSpeed
{
get
{
float speed = _rgbd.velocity.magnitude;
if (speedUnit == SpeedUnit.Imperial)
speed *= 2.23693629f;
else
speed *= 3.6f;
return speed;
}
}
private void VisualizeWheel(Wheel wheel)
{
//This method copies the position and rotation of the wheel collider and pastes it to the corresponding mesh!
if (wheel.mesh == null || wheel.collider == null)
return;
Vector3 position;
Quaternion rotation;
wheel.collider.GetWorldPose(out position, out rotation); //Fetch the position and Rotation from the WheelCollider into temporary variables
wheel.mesh.transform.position = position;
wheel.mesh.transform.rotation = rotation;
}
private void Start()
{
_rgbd = GetComponent<Rigidbody>();
if (centerOfMass != null && _rgbd != null)
_rgbd.centerOfMass = centerOfMass.localPosition;
for (int i = 0; i < wheels.Length; ++i)
VisualizeWheel(wheels[i]);
}
private void Move(float motorInput, float steerInput, bool handBrake)
{
HandBrake = handBrake;
motorInput = Mathf.Clamp(motorInput, -1f, 1f);
if (motorInput > 0f)
{
//Accelerate vehicle!
Accelerating = true;
Deccelerating = false;
}
else if (motorInput < 0f)
{
//Brake Vehicle!
Accelerating = false;
Deccelerating = true;
}
steerInput = Mathf.Clamp(steerInput, -1f, 1f);
float steer = steerInput * maxSteerAngle;
for (int i = 0; i < wheels.Length; ++i)
{
if (wheels[i].collider == null)
break;
if (wheels[i].wheelType == WheelType.FrontLeft || wheels[i].wheelType == WheelType.FrontRight)
{
wheels[i].collider.steerAngle = steer;
}
if (!handBrake)
{
wheels[i].collider.brakeTorque = 0f;
if (Accelerating)
wheels[i].collider.motorTorque = motorInput * maxTorque / 4f;
else if (Deccelerating)
wheels[i].collider.motorTorque = motorInput * maxBrakeTorque / 4f;
}
else
{
if (wheels[i].wheelType == WheelType.RearLeft || wheels[i].wheelType == WheelType.RearRight)
wheels[i].collider.brakeTorque = maxBrakeTorque * 20f;
wheels[i].collider.motorTorque = 0f;
}
if (wheels[i].mesh != null)
VisualizeWheel(wheels[i]);
}
StickToTheGround();
ManageSpeed();
}
//This Method Applies down force so that car grips the ground strongly
private void StickToTheGround()
{
if (wheels[0].collider == null)
return;
wheels[0].collider.attachedRigidbody.AddForce(-transform.up * downForce * wheels[0].collider.attachedRigidbody.velocity.magnitude);
}
//used to keep speed withing Minimum and maximum Speed Limits
private void ManageSpeed()
{
float speed = _rgbd.velocity.magnitude;
switch (speedUnit)
{
case SpeedUnit.Imperial:
speed *= 2.23693629f;
if (speed > topSpeed)
_rgbd.velocity = (topSpeed / 2.23693629f) * _rgbd.velocity.normalized;
break;
case SpeedUnit.Metric:
speed *= 3.6f;
if (speed > topSpeed)
_rgbd.velocity = (topSpeed / 3.6f) * _rgbd.velocity.normalized;
break;
}
}
private string imp = " MPH", met = " KPH";
private void Update()
{
if (speedText != null)
{
if (speedUnit == SpeedUnit.Imperial)
speedText.text = ((int)CurrentSpeed).ToString() + imp;
else
speedText.text = ((int)CurrentSpeed).ToString() + met;
}
}
private void FixedUpdate()
{
float motor = 0f, steering = 0f;
bool handBrakeInput = false;
#if UNITY_STANDALONE || UNITY_WEBGL
motor = Input.GetAxis("Vertical");
steering = Input.GetAxis("Horizontal");
handBrakeInput = Input.GetButton ("Jump");
#endif
#if UNITY_ANDROID || UNITY_IOS
steering = Input.acceleration.x;
if(accelerateButton != null)
{
if(accelerateButton.value)
motor = 1f;
}
if(brakeButton != null)
{
if(brakeButton.value)
motor = -1f;
}
if(handBrakeButton != null)
{
handBrakeInput = handBrakeButton.value;
if(handBrakeButton.value)
{
motor = 0f;
}
}
#endif
Move(motor, steering, handBrakeInput);
}
}
Comment
Answer by HappyPixel27 · Jul 09, 2020 at 06:21 PM
That is because unity is calculating the speed at which your car is going and keeps your car moving like a real car would when its a a fast speed.
but even when i stop pressing the S key the car still reversing
Can you show us a video clip of this happening?