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

Подключение мощности и оборотов к колёсам

Teras Teras Ученик (23), открыт 4 дня назад
Приветствую,прошу помощи в unity3d не могу применить грамотно к колёсам тягу от оборотов двигателя и мощности двигателя
EngineTorque - Это мощность двигателя
Rpm - Обороты двигателя
Bool Gaz - проверка нажат ли газ
CurrentGear - передача
Clutch - сцепление

Реализовано так,что при нажатии на газ активируется bool Gaz и обороты (Rpm) растут

  if (Engine)  //Если машина заведена 
{
Speed = GetComponent<Rigidbody>().velocity.magnitude;
if (Input.GetKey(KeyCode.W)) //если нажат газ
{
Gaz = true; //включаем булевую
Rpm += GazCorrectionsUp * Time.deltaTime; //прибавляем значение к оборотам
Rpm = Mathf.Min(Rpm, MaxRpm); //ограничиваем по максимальному значению
}
else //иначе
{
Gaz = false; //булевая выключена
Rpm -= GazCorrectionsDown * Time.deltaTime; //обороты падают по указанным значениям
Rpm = Mathf.Max(Rpm, IdleRpm); //Машина включена,значит падают до рабочего состояния
}
Далее пишу что если передача 1 и газ активен то приравнивал к колёсным коллайдерам обороты двигателя,эффект не тот,но и понять не могу как указать саму мощность двигателя для тяги ?
  public void EngineGaz() 
{
if (Clutch == 0 && currentGear == 1 && Gaz) //если сцепление отпущено и передача 1 и газ нажат то
{
FL.motorTorque = Rpm;
FR.motorTorque = Rpm;
}
else if (!Gaz)
{
FL.motorTorque = 0;
FR.motorTorque = 0;

}
}
1 ответ
Твой Профессор Профи (676) 4 дня назад
Значит, смотри. Сразу обращу внимание, что крутящий момент надо масштабировать в соответствии с тем, на какой передаче находится машина. Например, на первой передаче крутящий момент должен быть умножен на коэффициент передачи (например, 3.5 для первой передачи).
Немного (сильно) исправленный код будет у тебя выглядеть вот так:

public float EnginePower = 400f; // Максимальная мощность двигателя в ваттах
public float MaxTorque = 300f; // Максимальный крутящий момент в Нм на максимальных оборотах (например, 4000 RPM)
public float MaxRpm = 6000f; // Максимальные обороты двигателя
public float IdleRpm = 800f; // Обороты на холостом ходу
public BlackWheelCollider[] wheels; // Массив колесных коллайдеров

private void Update() {
HandleEngine();
ApplyEngineTorque();
}

private void HandleEngine() {
if (Engine) {
Speed = GetComponent<Rigidbody>().velocity.magnitude;

if (Input.GetKey(KeyCode.W)) { // если нажат газ
Gaz = true;
Rpm += GazCorrectionsUp * Time.deltaTime;
Rpm = Mathf.Min(Rpm, MaxRpm);
} else {
Gaz = false;
Rpm -= GazCorrectionsDown * Time.deltaTime;
Rpm = Mathf.Max(Rpm, IdleRpm);
}
}
}

private void ApplyEngineTorque() {
float currentTorque = 0;
if (Clutch == 0 && currentGear == 1 && Gaz) {
// Рассчитываем крутящий момент на основе мощности и оборотов
currentTorque = (EnginePower / MaxRpm) * Rpm;

// Ограничиваем крутящий момент по максимальному
currentTorque = Mathf.Min(currentTorque, MaxTorque);

// Применяем крутящий момент к колесам
foreach (WheelCollider wheel in wheels) {
wheel.motorTorque = currentTorque;
}
} else {
// Если газ не нажат или сцепление включено, обнуляем крутящий момент
foreach (WheelCollider wheel in wheels) {
wheel.motorTorque = 0;
}
}
}

Смотри, еще скажу о том, что добавлять коэффициенты для разных передач. Например, на первой передаче у тебя может быть 3.5, на второй — 2.5 и так далее. Именно это значение следует умножить на currentTorque при передаче на колёса.
Глянь, что ты правильно инициализируешь wheels массив с колесами, чтобы скрипт работал корректно. Также можешь заменить BlackWheelCollider на тип своего коллайдера, если он отличается.
Teras TerasУченик (23) 4 дня назад
Уважаемый,спасибо тебе огромное,хоть дело с места сдвинулось!)
Похожие вопросы