Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите с C# Unity

Adika3000 Ученик (146), на голосовании 9 месяцев назад
У меня в юнити есть машина (задний привод), и когда я разгоняюсь и резко нажимаю на ручник(Space) у меня задние колеса досихпор крутятся только через какоето время тормозят, что делать?
Вот код:
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;
}
}
Голосование за лучший ответ
♡$ⴎG@r₱u₷sყ♡ Искусственный Интеллект (157223) 10 месяцев назад
В вашем скрипте вы устанавливаете тормозное усилие на колеса только тогда, когда нажата клавиша пробела (` 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, и одновременно применяется тормозное усилие, что должно остановить вращение колес.
Adika3000Ученик (146) 10 месяцев назад
спасибо большое!!!
Похожие вопросы