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

UNITY \ машина, скрипт / ошибка с поворотм колеса

Александр Гаврилов Ученик (170), на голосовании 5 месяцев назад
НУ обьясню как можно короче и понятнее, я добавил скрипт на авто, все гуд, машина едет, но колесо не поворачивается практически, там оно слегка имеет поворот, почему?

using UnityEngine;

[RequireComponent(typeof(Rigidbody))]
public class CarController : MonoBehaviour
{
private Rigidbody _rb;
[SerializeField] private Transform _centreOfMass;
[SerializeField] private Wheel[] _wheels;

[SerializeField] private int _motorForce;
[SerializeField] private int _brakeForce;
[SerializeField] private float _brakeInput;
[SerializeField] private float _slipAllowance;

private float _verticalInput;
private float _horizontalInput;

private float _speed;
[SerializeField] private AnimationCurve _steeringCurve;

private void Start()
{
_rb = GetComponent<Rigidbody>();
_rb.centerOfMass = _centreOfMass.position;
}

private void Update()
{
Move();
Brake();

Steering();
CheckInput();

CheckParticles();
}

private void Move()
{
_speed = _rb.velocity.magnitude;

foreach (Wheel wheel in _wheels)
{
wheel.WheelCollider.motorTorque = _motorForce * _verticalInput;
wheel.UpdateMeshPosition();
}
}

private void CheckInput()
{
_horizontalInput = Input.GetAxis("Horizontal");
_verticalInput = Input.GetAxis("Vertical");

float movingDirectional = Vector3.Dot (transform.forward, _rb.velocity);
_brakeInput = (movingDirectional < -0.5f && _verticalInput > 0) || (movingDirectional > 0.5f && _verticalInput < 0) ? Mathf.Abs(_verticalInput) : 0;
}

private void Brake()
{
foreach (Wheel wheel in _wheels)
wheel.WheelCollider.brakeTorque = _brakeInput * _brakeForce * (wheel.IsForwardWheels ? 0.7f : 0.3f);
}

private void Steering()
{
float steeringAngle = _horizontalInput * _steeringCurve.Evaluate(_speed);
float slipAngle = Vector3.Angle(transform.forward, _rb.velocity - transform.forward);

if (slipAngle < 120)
steeringAngle += Vector3.SignedAngle(transform.forward, _rb.velocity, Vector3.up);

steeringAngle = Mathf.Clamp(steeringAngle, -48, 48);

foreach (Wheel wheel in _wheels)
{
if (wheel.IsForwardWheels)
wheel.WheelCollider.steerAngle = steeringAngle;
}
}

private void CheckParticles()
{
foreach (Wheel wheel in _wheels)
{
WheelHit wheelHit;
wheel.WheelCollider.GetGroundHit(out wheelHit);

if (Mathf.Abs(wheelHit.sidewaysSlip) + Mathf.Abs(wheelHit.forwardSlip) > _slipAllowance)
{
if (wheel.WheelSmoke.isPlaying == false)
wheel.WheelSmoke.Play();
}
else
wheel.WheelSmoke.Stop();
}
}
}

[System.Serializable]
public struct Wheel
{
public Transform WheelMesh;
public WheelCollider WheelCollider;
public ParticleSystem WheelSmoke;
public bool IsForwardWheels;

public void UpdateMeshPosition()
{
Vector3 position;
Quaternion rotation;

WheelCollider.GetWorldPose(out position, out rotation);

WheelMesh.position = position;
WheelMesh.rotation = rotation;
}
}
Голосование за лучший ответ
Mr. Miller Мастер (1127) 6 месяцев назад
  1. Проверьте значение steeringAngle: Убедитесь, что угол поворота колеса (steerAngle) достаточно велик, чтобы заметить изменения. Возможно, значение, которое вы вычисляете, слишком мало.
  2. Проверьте AnimationCurve _steeringCurve: Убедитесь, что кривая рулевого управления (_steeringCurve) правильно настроена и дает достаточный угол поворота при различных скоростях.
  3. Проверьте WheelCollider: Убедитесь, что WheelCollider правильно настроен и имеет правильные размеры и позиционирование относительно модели колеса.
  4. Проверьте ограничения Mathf.Clamp: Убедитесь, что ограничения, которые вы используете в Mathf.Clamp(steeringAngle, -48, 48), не слишком ограничивают угол поворота колеса.
  5. Проверьте логику if (slipAngle < 120): Эта проверка может неправильно корректировать угол поворота, особенно если slipAngle вычисляется некорректно.
  6. Проверьте UpdateMeshPosition: Убедитесь, что метод UpdateMeshPosition в структуре Wheel правильно обновляет позицию и вращение меша колеса.

Пример того, как можно увеличить угол поворота колеса:
 private void Steering()  
{
float steeringAngle = _horizontalInput * _steeringCurve.Evaluate(_speed) * 30f; // Увеличьте множитель для большего угла поворота

// Остальная часть кода
}
Попробуйте увеличить множитель в вычислении steeringAngle или отрегулируйте кривую _steeringCurve, чтобы увидеть, решит ли это вашу проблему с поворотом колеса. Если проблема сохраняется, возможно, потребуется более детальный анализ вашего кода и настроек в Unity.
Александр ГавриловУченик (170) 6 месяцев назад
Спасибо большое, не знаете, нету ли вирусов на assets4unity
Похожие вопросы