При float менее 0.2f Unity не прибавляет ускорение объекту

Рейтинг: 0Ответов: 1Опубликовано: 28.01.2023

Господа! Такая проблема: хочу сделать простенькую игрульку в Unity 3D, а-ля драг-рейсинг. Как известно, такая игра - ничто, если в ней нет равномерного ускорения. И чтобы сделать его, я обратился к прибавлению float = 0,1f к начальной скорости в FixedUpdate (т.к комп достаточно мощный и в простом Update машинка быстро выйдет на сверхзвук). Проблема в том, что при прибавлении 0,1f, значение текущей скорости начинает хаотично меняться, где-то далеко после запятой и машинка не двигается. Отследил значения переменной скорости, а там, что-то вроде "0,0012637963-5е". Такое же безобразие при 0,19f. Но стоит только установить 0,2f или больше, как всё начинает прекрасно работать. Поскольку, хочется реализовать режим прокачки автомобиля, то 0,2f многовато для начала и хочется получить изначально машинку гораздо медленнее. Как победить непонятные вычисления Unity? Заранее благодарю! Ниже сокращенный код класса:

using UnityEngine;

public class DragCar: MonoBehaviour
{

    private float _acceleration = 0.1f;   // *если здесь меньше 0,2f то ничего не работает*
    private float _maxSpeed = 100f;
    private float _speed = 0;

    [SerializeField] private float _currentSpeed = 1f;
    [SerializeField] private float _visualCurrentSpeed = 0;

    private Rigidbody _rb;


    void Start()
    {
        _rb= GetComponent<Rigidbody>();
    }


    void FixedUpdate()
    {
        _visualCurrentSpeed = _rb.velocity.z * 3.6f;
        _currentSpeed = _rb.velocity.z;

      if (Input.GetKey(KeyCode.UpArrow))
      {   
        if (_currentSpeed >= _maxSpeed) 
         { 
           _speed = _maxSpeed;
           _rb.velocity = new(0, 0, _speed);
         }
         else 
         {
           _rb.velocity = new(0, 0, _currentSpeed + _acceleration);  //вот здесь всё ломается          
         }
            
      }
    }
}

Ответы

▲ 0

Большое спасибо, Господину aepot и всем кто отозвался! Разобраться с вопросом почему Unity так делает вычисления не получилось, но проблему удалось решить (благодаря правильным мыслям прочитанным по ссылке от aepot) удалением переменной _curerentSpeed из вычисления вектора скорости и установки на её место итератора ++ _acceleration и умножением его на Time.fixedDeltaTime. Получилась такая строка:

_rb.velocity = new(0, 0, ++ _acceleration * Time.fixedDeltaTime);

Теперь, ускорение можно задавать даже как 0,001f.