Воскресенье, 11 Апреля 2021, 02:17

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Модератор форума: beril  
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Переключение передач?
Переключение передач?
labrob2013Дата: Воскресенье, 14 Августа 2016, 19:46 | Сообщение # 1
был не раз
Сейчас нет на сайте
Как реализовать переключение передач у машины, может есть примеры кода(Unity 5) ?

Email: labrob2013@yandex.ru
AlfeДата: Воскресенье, 14 Августа 2016, 20:13 | Сообщение # 2
старожил
Сейчас нет на сайте
labrob2013, как на счёт примеров желаемого. Или более подробного устного объяснения того, чего нужно достичь?

Группа нашей команды. Там есть интересная рубрика... иногда игры выходят

Моя первая игpa - Crazy Penguin
labrob2013Дата: Воскресенье, 14 Августа 2016, 20:20 | Сообщение # 3
был не раз
Сейчас нет на сайте
Нужно сделать переключение передач как в "Need For Speed Underground 1", т.е если с первой передачи переключится на третью будет долго разгонятся машина... Можете видео посмотреть этой игры "Need For Speed Underground 1" драг рейсинг

Email: labrob2013@yandex.ru
URGINSANДата: Воскресенье, 14 Августа 2016, 21:46 | Сообщение # 4
почти ветеран
Сейчас нет на сайте
В теории думаю так. Вводим 5 переменных float (5 передач), у них указываем разные, типа "передаточные" числа. Также вводим переменную, на которую будет умножаться скорость при нажатии на газ. Эта переменная будет принимать значения передаточных чисел в зависимости от текущей передачи. Тем самым, чем передача выше, тем труднее набирается скорость. Грубо говоря вот кусочек кода, не проверял, но в теории должно работать.
Код

public float gear1 = 1; //значение подобрать методом тыка
public float gear2 = 0.8f; //значение подобрать методом тыка
public float gear3 = 0.6f; //значение подобрать методом тыка
public float gear4 = 0.4f; //значение подобрать методом тыка
public float gear5 = 0.2f; //значение подобрать методом тыка
public float currentGearForce;
public int currentGear = 0; //0== нейтралка.

void Update()
{
    if (Input.GetKeyDown(Keycode.W) && currentGear != 0){
        Умножаем скорость машины на переменную currentGearForce * Time.deltaTime;
    }
    if (currentGear == 1){
        currentGearForce = gear1;
    }
    if (currentGear == 2){
        currentGearForce = gear2;
    }
    if (currentGear == 3){
        currentGearForce = gear3;
    }
    if (currentGear == 4){
        currentGearForce = gear4;
    }
    if (currentGear == 5){
        currentGearForce = gear5;
    }
}

Потом делаем так, чтобы если тахометр приближается к красной зоне, то передача выше (для автомата)
Код

currentGear ++;


Для механики соответственно тоже самое, но при нажатии на кнопку.


Я на драйве

Сообщение отредактировал URGINSAN - Воскресенье, 14 Августа 2016, 21:48
SaiteiДата: Воскресенье, 14 Августа 2016, 22:20 | Сообщение # 5
старожил
Сейчас нет на сайте
Цитата URGINSAN ()
if (currentGear == 1){
        currentGearForce = gear1;
    }
    if (currentGear == 2){
        currentGearForce = gear2;
    }
    if (currentGear == 3){
        currentGearForce = gear3;
    }
    if (currentGear == 4){
        currentGearForce = gear4;
    }
    if (currentGear == 5){
        currentGearForce = gear5;
    }

Лучше заменить на else if. Ещё лучше - switch
labrob2013Дата: Воскресенье, 14 Августа 2016, 23:25 | Сообщение # 6
был не раз
Сейчас нет на сайте
[Edy's vehicle physics] а куда код написать переключение передач (файл...), куда вставлять место ?

Добавлено (14 августа 2016, 23:25)
---------------------------------------------
куда вписать?

Код

...
  void Update ()
  {
   if (spinUpdateRate == UpdateRate.Disabled)
   {
    foreach (WheelData wd in m_wheelData)
    {
     UpdateSteering(wd);
    }
   }
   else
    if (spinUpdateRate == UpdateRate.OnUpdate || wheelPositionMode == PositionMode.Accurate)
   {
    bool needDisableColliders =    m_rigidbody.interpolation != RigidbodyInterpolation.None
     && wheelPositionMode == PositionMode.Accurate;
    
    if (needDisableColliders)
     DisableCollidersRaycast();
    
    foreach (WheelData wd in m_wheelData)
    {
     UpdateSteering(wd);
     UpdateTransform(wd);
    }
    
    if (needDisableColliders)
     EnableCollidersRaycast();
   }
   
   // Drag state is smoothly faded to zero. It gets raised/modified from the drag contacts.
   
   if (processContacts)
   {
    UpdateDragState(Vector3.zero, Vector3.zero, m_localDragHardness);
    // debugText = string.Format("Drag Pos: {0}  Drag Velocity: {1,5:0.00}  Drag Friction: {2,4:0.00}", localDragPosition, localDragVelocity.magnitude, localDragFriction);
   }
  }
  
  
  void FixedUpdate ()
  {
   // Ensure input values within range
   
   throttleInput = Mathf.Clamp (throttleInput, -1.0f, +1.0f);
   brakeInput = Mathf.Clamp01(brakeInput);
   handbrakeInput = Mathf.Clamp01(handbrakeInput);
   
   // Update common variables
   
   m_speed = Vector3.Dot(m_rigidbody.velocity, m_transform.forward);
   m_speedAngle = Vector3.Angle(m_rigidbody.velocity, m_transform.forward) * Mathf.Sign(m_speed);
   
   // Prepare common data
   
   float referenceDownforce =
    computeExtendedTireData? (m_rigidbody.mass * Physics.gravity.magnitude) / m_wheelData.Length : 1.0f;
   
   // Apply wheel physics
   
   bool needUpdateVisuals =
    spinUpdateRate == UpdateRate.OnFixedUpdate && wheelPositionMode == PositionMode.Fast;
   
   int groundedWheels = 0;
   
   foreach (WheelData wd in m_wheelData)
   {
    if (!disallowRuntimeChanges)
     UpdateWheelCollider(wd.collider);
    
    if (needUpdateVisuals)
     UpdateSteering(wd);
    
    UpdateSuspension(wd);
    UpdateLocalFrame(wd);
    UpdateGroundMaterial(wd);
    
    ComputeTireForces(wd);
    ApplyTireForces(wd);
    
    UpdateWheelSleep(wd);
    
    // Update visual wheel object
    
    if (needUpdateVisuals)
     UpdateTransform(wd);
    
    if (wd.grounded) groundedWheels++;
    
    // Calculate extended tire data
    
    if (computeExtendedTireData)
     ComputeExtendedTireData(wd, referenceDownforce);
   }
   
   // Apply aerodynamic properties
   
   float sqrVelocity = m_rigidbody.velocity.sqrMagnitude;
   
   Vector3 dragForce = -aeroDrag * sqrVelocity * m_rigidbody.velocity.normalized;
   Vector3 loadForce = -aeroDownforce * sqrVelocity * m_transform.up;
   Vector3 aeroAppPoint = m_transform.position + m_transform.forward * aeroAppPointOffset;
   
   m_rigidbody.AddForceAtPosition(dragForce, aeroAppPoint);
   if (groundedWheels > 0) m_rigidbody.AddForceAtPosition(loadForce, aeroAppPoint);
   
   // debugText = string.Format("AeroDrag: {0,6:0.} AeroForce: {1,6:0.}", dragForce.magnitude, loadForce.magnitude);
   
   // Handle impacts
   
   if (processContacts)
    HandleImpacts();
  }
...

?


Email: labrob2013@yandex.ru

Сообщение отредактировал labrob2013 - Воскресенье, 14 Августа 2016, 22:55
URGINSANДата: Воскресенье, 14 Августа 2016, 23:36 | Сообщение # 7
почти ветеран
Сейчас нет на сайте
Цитата Saitei ()
Лучше заменить на else if. Ещё лучше - switch

Начинающему думаю так понятней будет.

Цитата labrob2013 ()
а куда код написать переключение передач (файл...), куда вставлять место ?

Если возникают такие вопросы, лучше бросить затею с переключениями передач.
Я написал примерный код, если у тебя еще отсутствует внутрикодовое мышление, лучше изучить сначала основы. Потому что дальше будет только хуже и сложнее, будешь по каждому поводу на форуме спрашивать?


Я на драйве
labrob2013Дата: Понедельник, 15 Августа 2016, 19:21 | Сообщение # 8
был не раз
Сейчас нет на сайте
https://vk.com/doc223105033_437768010
Помогите разобраться в этом файле где ГАЗ и где нужно менять скорость ?

Добавлено (15 августа 2016, 16:16)
---------------------------------------------
помогите пожалуйста

Добавлено (15 августа 2016, 19:21)
---------------------------------------------
куда вставить код в файл?

Car3manДата: Понедельник, 15 Августа 2016, 23:19 | Сообщение # 9
был не раз
Сейчас нет на сайте
labrob2013, основы сначала изучи

Сообщение отредактировал Car3man - Понедельник, 15 Августа 2016, 23:20
labrob2013Дата: Вторник, 16 Августа 2016, 23:48 | Сообщение # 10
был не раз
Сейчас нет на сайте
я знаю уже давно изучил основы, только что то я не могу найти куда вставлять помогите

Добавлено (16 августа 2016, 23:48)
---------------------------------------------
а какие могут ещё быть варианты, как у игры (Need For Speed Underground 1).
примерно:
0 - 10
10 - 40
40 -80
80 - 120
120 -180
180 -250
?


Email: labrob2013@yandex.ru
URGINSANДата: Пятница, 19 Августа 2016, 19:26 | Сообщение # 11
почти ветеран
Сейчас нет на сайте
Цитата labrob2013 ()
я знаю уже давно изучил основы

:facepalm:
Дык, если после "изучил основы" возникают такие вопросы, то вряд ли ты "изучил основы".


Я на драйве
AlfeДата: Пятница, 19 Августа 2016, 19:54 | Сообщение # 12
старожил
Сейчас нет на сайте
labrob2013, вставлять в скрипт. Как скрипты создавать знаем)?

Группа нашей команды. Там есть интересная рубрика... иногда игры выходят

Моя первая игpa - Crazy Penguin
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Переключение передач?
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2021 Рейтинг