Неверный расчёт движения Unity3D

Задача реализовать перемещение кубика прыжками строго на фиксированную длину, таким образом, чтобы он перемещался только по целочисленным координатам. Реализовано было через просчёт вектора скорости баллистической траектории с заданным углом и расстоянием(в примере - 45° и 2 единицы расстояния), с последующим разложением на вектора по X, Y и присваиванию rigidbody.velocity . Проблема в том, что полученные по формуле значения на бумаге чётко совпадают с необходимыми, но новое положение объекта в Unity немного расходится с необходимым, сбивая целочисленные координаты. Перемещение объекта в Unity стремится к 2 при уменьшении Fixed TimeStep, но также остаётся не целым. С чем связанно данное расхождение?

Начальное положение:

Один свайп влево

void Update(){
 ...
 if(touch.phase == TouchPhase.Ended)  // обработка свайпов и выбор направления прыжка 
  {        
        directionChosen = true;
        if (swipe.magnitude < min_swipe_distance) 
             return;
        if(Mathf.Abs(swipe.x)> Mathf.Abs(swipe.y)) // Horizontal Swipe
          {  
            if (swipe.x > 0) {             // Right 
                    Debug.Log("right");                        
                    fromTo = new Vector3(0.0f, 0.0f, -1.0f);
                } else {                   // Left 
                    Debug.Log("left");
                    fromTo = new Vector3(0.0f, 0.0f, 1.0f);
                  }
             } else {                           //Vertical swipe
                    if (swipe.y > 0) {      // Up
                        Debug.Log("up");
                        fromTo = new Vector3(1.0f, 0.0f, 0.0f);
                    } else {                // Down
                        Debug.Log("down");
                        fromTo = new Vector3(-1.0f, 0.0f, 0.0f);
                    }
  }   
    ...
}
void FixedUpdate() {
   if(directionChosen) {
         float x;
            if(fromTo.x == 0)  {
               x = fromTo.z*jumpDistance;  //
            } else {                       //  Перемещение по X
               x = fromTo.x*jumpDistance;  //
            }
         float y = fromTo.y;     // Перемещение по Y
         float Angle = 45*Mathf.PI / 180;  // Перевод 45 градусов в радианы
         float v2 = (g * x*x)/(2*(y - Mathf.Tan(Angle) * x )*Mathf.Pow(Mathf.Cos(Angle), 2));  //Квадрат необходимой скорости 
         float v = Mathf.Sqrt(Mathf.Abs(v2));   // Извлечение корня
         rb.velocity = new Vector3(fromTo.x*v*Mathf.Cos(Angle), v*Mathf.Sin(Angle), fromTo.z*v*Mathf.Cos(Angle)); // Задание вектора скорости по базовым векторам 
         directionChosen = false;
    }
 }

Ответы (1 шт):

Автор решения: Andrew

Вероятнее всего это связано с физикой)

Потому что еще нужно учитывать заодно и физический материал куба(сила трения, сила отпрыгивания) и сопротивление воздуха.

Предлагаю на куб заассайнить физический материал и донастроить его, а так же выставить настройку Drag у ригитбади на такие настройки, в которых конечное положение куба будет максимально близким к расчетным.

После чего по окончанию прыжка(после полной остановки, после того как velocity будет 0) просто подправлять положение до "идеального"

→ Ссылка