В вашем скрипте вы устанавливаете тормозное усилие на колеса только тогда, когда нажата клавиша пробела (`
KeyCode.Space `). Это означает, что пока пробел не будет нажат, колеса будут продолжать вращаться под действием двигателя, так как момент, приложенный к колесам заднего привода (`_colliderBL` и `_colliderBR`), не обнуляется.
Чтобы решить эту проблему, вам нужно обнулить `motorTorque` задних колес, когда активируется ручной тормоз. Вот как вы можете это исправить:
```csharp
private void FixedUpdate()
{
// Check if the handbrake is being applied
bool handbrake = Input.GetKey(KeyCode.Space);
// If handbrake is applied, set motor torque to zero for the rear wheels and apply brake torque
if (handbrake)
{
_colliderBL.motorTorque = 0f;
_colliderBR.motorTorque = 0f;
_colliderFL.brakeTorque = 3000f;
_colliderFR.brakeTorque = 3000f;
_colliderBL.brakeTorque = 3000f;
_colliderBR.brakeTorque = 3000f;
}
else
{
// Apply motor torque to rear wheels if handbrake is not applied
_colliderBL.motorTorque = Input.GetAxis("Vertical") * _force;
_colliderBR.motorTorque = Input.GetAxis("Vertical") * _force;
// Release brake torque on all wheels
_colliderFL.brakeTorque = 0f;
_colliderFR.brakeTorque = 0f;
_colliderBL.brakeTorque = 0f;
_colliderBR.brakeTorque = 0f;
}
// The rest of your code...
}
```
Теперь когда вы нажимаете пробел, `motorTorque` для задних колес сбрасывается до 0, и одновременно применяется тормозное усилие, что должно остановить вращение колес.
Вот код:
using UnityEngine;
public class CarController : MonoBehaviour
{
[SerializeField] private Transform _transformFL;
[SerializeField] private Transform _transformFR;
[SerializeField] private Transform _transformBL;
[SerializeField] private Transform _transformBR;
[SerializeField] private WheelCollider _colliderFL;
[SerializeField] private WheelCollider _colliderFR;
[SerializeField] private WheelCollider _colliderBL;
[SerializeField] private WheelCollider _colliderBR;
[SerializeField] private float _force;
[SerializeField] private float _maxAngle;
// Start is called before the first frame update
private void FixedUpdate()
{
// Apply motor torque to all wheels
_colliderBL.motorTorque = Input.GetAxis("Vertical") * _force;
_colliderBR.motorTorque = Input.GetAxis("Vertical") * _force;
if (Input.GetKey( KeyCode.Space ))
{
// Apply brake torque to all wheels
_colliderFL.brakeTorque = 3000f;
_colliderFR.brakeTorque = 3000f;
_colliderBL.brakeTorque = 3000f;
_colliderBR.brakeTorque = 3000f;
}
else
{
// Release brake torque on all wheels
_colliderFL.brakeTorque = 0f;
_colliderFR.brakeTorque = 0f;
_colliderBL.brakeTorque = 0f;
_colliderBR.brakeTorque = 0f;
}
// Apply steering angle to front wheels
_colliderFL.steerAngle = _maxAngle * Input.GetAxis("Horizontal");
_colliderFR.steerAngle = _maxAngle * Input.GetAxis("Horizontal");
// Rotate all wheels
RotateWheel(_colliderFL, _transformFL);
RotateWheel(_colliderFR, _transformFR);
RotateWheel(_colliderBL, _transformBL);
RotateWheel(_colliderBR, _transformBR);
}
private void RotateWheel(WheelCollider collider, Transform transform)
{
Vector3 position;
Quaternion rotation;
collider.GetWorldPose(out position, out rotation);
transform.rotation = rotation;
transform.position = position;
}
}