Поиск пути на Unity3d с помощью библиотеки A* Pathfinding Project
Я уже писал о реализации алгоритма A*, теперь я хочу поделиться инструкцией по использованию готовой библиотеки на Unity 3D.
Начало работы
- Скачиваем бесплатную версию здесь, распаковываем скачанный архив.
- Через пункт меню Assets -> Import Package -> Custom Package… импортируем скачанный пакет.
- Создаем плоскость, на ней создаем несколько кубов – препятствий, располагаем их на отдельном слое Cubes. Плоскость располагаем на слое Ground.
- Создаем новый GameObject, называем его A*. Добавляем к нему компонент AstarPath (Components -> Pathfinding -> Pathfinder)
- В редакторе объекта во вкладке «Graphs» добавляем Grid Graph.
- В настройках грида есть два раздела – Collision Testing и Height Testing – проверка столкновений и высоты соответственно. У каждого из них есть свойство Mask – маска по слоям, для которых будет работать проверка. Выставляем для Collision Testing слой Cubes, для Height Testing – слой Ground.
Определение маршрута
- Создаем GameObject, называем его Player, располагаем его на поверхности, слой ставим Cubes – как у препятствий.
- Добавляем ему компонент Seeker
- Добавляем ему скрипт:
using UnityEngine; using System.Collections; using Pathfinding; public class AIScript : MonoBehaviour { public Vector3 targetPosition; void Start () { Seeker seeker = GetComponent(); seeker.StartPath(transform.position, targetPosition); } }
Метод StartPath возвращает объект Path, который содержит последовательность точек маршрута. Сейчас нам достаточно того, что Seeker нарисует gizmo с этим путем.
Способ без коллайдеров
Если проходимость должна определяться не коллайдерами, а какими-то другими параметрами, нужно сделать следующее:
Убрать галочки у Collision Testing и Height Testing. Слой плоскости и Player – делаем Default. Кубики убираем за ненадобностью.
В коде заполнить проходимость грида:
var grid = AstarPath.active.graphs[0] as GridGraph; foreach (var node in grid.nodes) if ((node.position.x == 500) && (node.position.z != 3500)) node.walkable = false;
Здесь node.position – положение ячейки грида в «миллиметрах», т.е. для преобразования в нормальные координаты нужно делить на 1000.
Сглаживание пути
Персонажи в игре не могут передвигаться такими ломаными путями, нужно их сгладить. Для этого добавляем компонент Components -> Pathfinding -> Modifiers -> Simple Smooth к тому же объекту, к которому добавили Seeker. Немного увеличиваем у этого компонента параметр Strength и получаем такой путь: