Добавить в корзинуПозвонить
Найти в Дзене
Two Box Games

Навигация. 08.08.2025

Сегодня колдовская ночь, когда я вновь погружаюсь в размышления об игре. Цех затих, лишь полночь шепчет свои секреты. Но отвлечёмся от манящей тишины и вернёмся к нашей важной и непростой теме — навигации! Да-да, навигации! Давайте разложим её на этапы и всмотримся в саму суть этого термина. Любой
вражеский или дружественный NPC должен двигаться, будь то по заданной
траектории или по хитросплетённому пути. Реализаций — великое множество:
таргет-поинты, сплайны и прочие ухищрения. Но мы-то хотим, чтобы моб не
просто двигался, а определял ближайшие цели, обходил препятствия,
патрулировал территорию и, конечно же, преследовал главного героя,
мечтая задать ему взбучку. И поверьте, у вражеских NPC это желание
ничуть не слабее, чем у игрока — желание выжить и победить. Следующий этап — расчёт навигационного пути. Благо, Epic Games спрятали всю магию под капот, и нам остаётся лишь обозначить область просчёта и задать параметры, чтобы сделать навигацию более плавной и доступной. И в зав

Сегодня колдовская ночь, когда я вновь погружаюсь в размышления об игре. Цех затих, лишь полночь шепчет свои секреты. Но отвлечёмся от манящей тишины и вернёмся к нашей важной и непростой теме — навигации! Да-да, навигации!

Давайте разложим её на этапы и всмотримся в саму суть этого термина. Любой
вражеский или дружественный NPC должен двигаться, будь то по заданной
траектории или по хитросплетённому пути. Реализаций — великое множество:
таргет-поинты, сплайны и прочие ухищрения. Но мы-то хотим, чтобы моб не
просто двигался, а определял ближайшие цели, обходил препятствия,
патрулировал территорию и, конечно же, преследовал главного героя,
мечтая задать ему взбучку. И поверьте, у вражеских NPC это желание
ничуть не слабее, чем у игрока — желание выжить и победить.

Следующий этап — расчёт навигационного пути. Благо, Epic Games спрятали всю магию под капот, и нам остаётся лишь обозначить область просчёта и задать параметры, чтобы сделать навигацию более плавной и доступной. И в завершение — танец анимации: смешивание движений через Blend Space, настройка Anim Blueprint, создание State Machine (своего рода поведенческого каркаса персонажа), настройка Notify-параметров… Итак, этапы разложены по полочкам.

Теперь нас интересует сердце процесса — движение. В Unreal Engine кроется одна коварная проблема: казалось бы, просто указываешь NPC цель через AIMoveTo или SimpleMove, и радуйся жизни. Но не тут-то было! Всплывают блокировки, ошибки поиска пути, внезапные «аборты» действий (да, в анимационном мире прервать анимацию — это именно аборт, как бы странно это ни звучало). И вот, несутся два вражеских NPC на игрока, и что же? Они врезаются друг в друга и начинают нелепо топтаться на месте. Зрелище, прямо скажем, обескураживающее.

-2

Чтобы избежать этого комичного хаоса, есть множество способов. Один из них — использовать свойство контроллера RVO, позволяющее определять ближайшие цели и избегать столкновений. Но и здесь нас поджидает подводный камень: NPC начинает «тупить» и бесконечно бежать вперёд, словно загипнотизированный. Тогда ты судорожно роешь глубже и находишь новый тип контроллера Detour, который открывает новые горизонты владения навигацией. Ты запускаешь счётчик FPS и видишь, как 10 одновременно атакующих NPC обрушивают твой FPS до нуля. Поздравляю, приехали! Остановка — сердечный приступ.

После долгих скитаний по закоулкам разума приходит озарение: а что, если мы
сами будем прокладывать маршрут, находить ближайшие цели и обходить их?
Для этого нужно определить, сколько NPC рядом, насколько близко, чтобы
наша коллизия не проскочила между ними. И тут на сцену выходит Line Trace — прекрасная вещь, определяющая всех ближайших NPC и передающая их вектор положения. Но сам по себе Trace — ресурсозатратный, поэтому в следующей главе мы поговорим об оптимизации и упрощении жизни. А пока вернёмся к красе.

Итак, мы определили, что через пару сотен миллисекунд наш NPC столкнётся с другим. Что делать?

  1. Во-первых, постоянно проверять допустимое расстояние, в пределах которого мы можем пропустить дальше.
  2. Во-вторых, использовать Avoidance Distance (дистанцию избегания), которая отправит нашего NPC в обратном направлении.

Звучит запутанно? Объясню проще: есть два NPC, бегущих к одной цели. Когда они оба доберутся до неё, то неизбежно столкнутся. Чтобы этого избежать, мы
говорим тому, кто прибежал позже: «Беги обратно с силой Avoidance!». Он послушно поворачивает назад, а, добежав до указанной точки, снова рвётся к той же цели — и вот он, замкнутый круг!

-3

Тут в дело вступает тригонометрия. Не буду подробно объяснять синусы,
косинусы и нормализацию, так как я сам не семи пядей во лбу в
математике. Да и чат-ботники в интернете разжуют вам матчасть гораздо
лучше. Суть в том, что, добавляя NPC обратный ход, мы одновременно
смещаем его по оси, чтобы он как бы обегал препятствие. В итоге, при Radius, равном, скажем, 80, и Distance, равном 150, ваш NPC будет обходить блокирующий путь и искать свободный проход.

Вот и вся логика движения нескольких NPC к одной цели, с учётом того, что Trace можно ограничить только во время бега и только в определённый промежуток времени. Тогда просадка FPS будет минимальной и допустимой для
реализации игры на 
чистом Blueprint.

Ну а пока вы это перевариваете, я подготовлю следующую статейку для осмысления — и без кофе тут не обойдётся. До встречи!

#BlueprintDev #VisualScripting #UE5 #UnrealEngine #IndieGameDev 
#GameplayProgrammer #TechnicalDesigner #GameLogic #AI #UI 
#AnimationBlueprints #Prototyping #Git