TGViewer
Unity: Всё, что вы не знали о разработке Unity: Всё, что вы не знали о разработке @unsafecsharp · 1.74K subscribers
Post #223 3.18K
Как перемещать персонажа по точкам правильно

Многие из вас делали перемещение персонажа по нодам. Например, когда поиск пути вернул массив точек, а нам нужно персонажем пройти по ним.
Обычно такой код выглядит примерно так:


var nextPoint = points[index];
if ((nextPoint - position).sqrMagnitude <= MIN_DISTANCE_SQR) {
++index;
if (index >= points.Length) {
// Мы дошли до конца пути
return;
}
}

position = Vector3.MoveTowards(position, nextPoint, dt * speed);


Логика понятная: дошли до точки - берем следующую и идем к ней, и так пока не дойдем до конца.

Но в таком подходе кроется одна проблема: если персонаж проходит за кадр 1 метр, а расстояние до точки 0.5 метра, то персонаж будет проходить на самом деле меньшее расстояние, чем должен был:


-[]--[]--[]--[]--[]
---------------[] // Этот персонаж дойдет до конца быстрее, чем первый


Что делать?

На самом деле нужно использовать примерно такую логику:


var distance = speed * dt;
while (distance > 0f) {
var nextNodePos = points[index];
var distanceToNextNode = (nextNodePos - currentPos).magnitude;
if (distance >= distanceToNextNode) {
distance -= distanceToNextNode;
currentPos = nextNodePos;
++index;
if (index >= points.Length) break;
continue;
}
var direction = (nextNodePos - currentPos).normalized;
currentPos = direction * distance;
break;
}


Метод HasReached должен проверять "перешли ли мы точку или еще нет". Таким образом, мы "перебрасываем" часть длины, которую мы прошли на новую точку, а если перешли и ее, то еще раз и так пока либо не закончится этот хвост, либо мы не дойдем до конца.
Грубо говоря, если персонаж будет двигаться со скоростью 1000 метров в секунду, а контрольных точек на пути будет много (например, каждый метр), то за секунду он пройдет ровно 1000 метров, а в первом варианте намного меньше.

#unity #algorithms #movement
  • 🔥 45
  • ❤ 4
  • 👍 1
More from @unsafecsharp
  1. Mar 2, 2026Век живи - век учись Я вот только сегодня узнал, что оказывается можно писать не только та…
  2. Feb 10, 2026Overlay У юнити, начиная с 2022.2, появилась возможность рисовать свои окна в SceneView, п…
  3. Dec 20, 2025Удобное API Вы наверняка сталкивались с такой проблемой: void Method<T>(System.Action<T> c…
  4. Dec 7, 2025Простые лайфхаки Часто встречаю в разных проектах подобные конструкции (на самом деле обыч…
  5. Nov 18, 2025Довольно интересная задачка попалась на собеседовании в гугле: Есть матрица (массив массив…
  6. Oct 12, 2025Unity.Profiling.IgnoredByDeepProfilerAttribute Аттрибут, который спасет вам время, если у…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →