I am working on a racing game and have an issue with the vehicle controller. When the car gets moving the brake becomes very unresponsive and the car will keep accelerating until it hits something or spins out. The steering continues to work perfectly when moving but the acceleration seems to lock for some reason.
The code:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum Axel
{
Front,
Rear
}
[Serializable] public struct Wheel
{
public Transform model;
public WheelCollider collider;
public Axel axel;
}
public class CarController : MonoBehaviour
{
private Rigidbody _rigidbody;
[SerializeField] private Transform _centerOfMass;
[SerializeField] private float motorTorque = 1500f, maxSteer = 20f, breakTorque = 2500f;
[SerializeField] private List<Wheel> wheels;
[SerializeField] private bool allWheelDrive = false;
[SerializeField] private bool isBreaking;
private float horizontalInput, verticalInput;
void Start()
{
_rigidbody = GetComponent<Rigidbody>();
_rigidbody.centerOfMass = _centerOfMass.localPosition;
}
void Update()
{
UpdateWheels();
}
void FixedUpdate()
{
GetInput();
Move();
Steer();
}
void GetInput()
{
horizontalInput = Input.GetAxis("Horizontal");
verticalInput = Input.GetAxis("Vertical");
isBreaking = Input.GetKey(KeyCode.Space);
}
void Move()
{
foreach (var wheel in wheels)
{
if (allWheelDrive)
{
wheel.collider.motorTorque = verticalInput * motorTorque;
if (isBreaking)
{
ApplyBreaking(breakTorque);
}
else
{
ApplyBreaking(0f);
}
}
else
{
if (wheel.axel == Axel.Rear)
{
wheel.collider.motorTorque = verticalInput * motorTorque;
if (isBreaking)
{
ApplyBreaking(breakTorque);
}
else
{
ApplyBreaking(0f);
}
}
}
}
}
void Steer()
{
foreach (var wheel in wheels)
{
if (wheel.axel == Axel.Front)
{
var _steerAngle = horizontalInput * maxSteer;
wheel.collider.steerAngle = Mathf.Lerp(wheel.collider.steerAngle, _steerAngle, 0.5f);
}
}
}
void UpdateWheels()
{
foreach (var wheel in wheels)
{
Vector3 _pos;
Quaternion _rot;
wheel.collider.GetWorldPose(out _pos, out _rot);
wheel.model.position = _pos;
wheel.model.rotation = _rot;
}
}
void ApplyBreaking(float breakTorque)
{
foreach (var wheel in wheels)
{
if (wheel.axel == Axel.Rear)
{
wheel.collider.brakeTorque = breakTorque;
}
}
}
}