Движение по клеткам, волновой алгоритм

Наша задача, организовать движение юнитов по клеткам, как в пошаговых стратегиях, наподобие King's Bounty и похожих. То есть, речь идет о небольшом поле, типа шахматной доски, где собственно и происходит бой юнитов. Существуют различные алгоритмы поиска пути в двумерном массиве, у каждого из них есть свои достоинства и недостатки. В нашем же случаи, мы будем использовать волновой алгоритм (Алгоритм Ли), он отлично подходит под наши задачи, понятен и прост в освоении. Реализация проекта, состоит из двух частей. Первая, это сам алгоритм и подготовка поля боя (массива) для него. Вторая часть, управление юнитами, создание маршрута движения и вектора вращения.


Тем кто играл в игры с пошаговыми боями, хорошо известно, что в процессе боя, на поле могут появляться временные объекты. Исходя из этого, нам нужно учитывать, что состояние клеток поля может меняться не только после хода, но и до него. Поэтому, для обновления состояния поля, мы будем использовать рейкаст, чтобы проверить занята-ли клетка и какой объект ее занимает.

Пара слов о модели юнита:

Движение по клеткам, волновой алгоритм

Модель нужно создавать так, чтобы "лицо" юнита было по направлению оси Z. Так же, у юнита должен быть коллайдер и установлен стандартный тег Player, данный тег означает, что объектом можно управлять. Для 2D спрайта "лицо" модельки, это ось Х.

Шаблон клетки, это квадрат, мы рекомендуем стандартный Quad, так как его начальный размер равен единице. На шаблоне так же должен быть коллайдер, в режиме триггера, плюс, нужно установить для него отдельный слой, который потом указывается в настройках скрипта, это нужно, чтобы луч поиска клетки не "цеплялся" за другие объекты.

На шаблон клетки вешаем скрипт PathfindingNode.
Здесь у нас несколько переменных для хранения данных массива и состояния поля.

Волновой алгоритм с поиском пути Pathfinding.
Конечный результат выдается в виде массива клеток, которые ведут от юнита и до цели.

Далее, на сцену вешаем PathfindingField.
Это скрипт управления, здесь обрабатывается массив волнового алгоритма и на его основе создается маршрут и вектора направления для юнита. Движение юнита также делается тут, плюс, мы добавили комментарии, где можно сделать переключение анимации юнита (движение, разворот, ожидание, атака).


Стоит отметить, что игровое поле нужно делать только через данный метод в редакторе.

Если на игровом поле был удален объект или добавлен новый:

PathfindingField.UpdateNodeState();

Нужно сделать вызов данного метода, чтобы обновить состояние клеток.

Скачать все скрипты и демо проект:
https://www.patreon.com/posts/dvizhenie-po-23168944
Тестировалось на: Unity 2017.1.0

Комментариев 31

Офлайн
ugenT 14 декабря 2018
Light,
Спасибо, вроде бы придумал как использовать данный алгоритм для своих роботов)
Спасибо за тутор.
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Яндекс.Метрика