Поиск пути на Unity3d с помощью библиотеки A* Pathfinding Project

28.08.2013 at 19:17

Я уже писал о реализации алгоритма A*, теперь я хочу поделиться инструкцией по использованию готовой библиотеки на Unity 3D.

Начало работы

  1. Скачиваем бесплатную версию здесь, распаковываем скачанный архив.
  2. Через пункт меню Assets -> Import Package -> Custom Package… импортируем скачанный пакет.
  3. Создаем плоскость, на ней создаем несколько кубов – препятствий, располагаем их на отдельном слое Cubes. Плоскость располагаем на слое Ground.
  4. Создаем новый GameObject, называем его A*. Добавляем к нему компонент AstarPath (Components -> Pathfinding -> Pathfinder)
  5. В редакторе объекта во вкладке «Graphs» добавляем Grid Graph.
  6. В настройках грида есть два раздела – Collision Testing и Height Testing – проверка столкновений и высоты соответственно. У каждого из них есть свойство Mask – маска по слоям, для которых будет работать проверка. Выставляем для Collision Testing слой Cubes, для Height Testing – слой Ground.

Определение маршрута

  1. Создаем GameObject, называем его Player, располагаем его на поверхности, слой ставим Cubes – как у препятствий.
  2. Добавляем ему компонент Seeker
  3. Добавляем ему скрипт:
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 и получаем такой путь: