Навигация 2D: выбрать систему и запустить движение
От модели маршрута до физического движения и проверки цели.
Начните с выбора модели маршрута. Навигация ищет путь; игровой код двигает персонажа, а физика проверяет столкновения. Наличие одной системы не создаёт две остальные.
Какой API выбрать
| Задача | Класс / API |
|---|---|
| Заранее заданные точки и связи между ними | AStar2D. |
| Перемещение по клеткам прямоугольной сетки | AStarGrid2D. |
| Движение внутри произвольной проходимой поверхности | NavigationServer2D с картой и полигонами. |
| Готовая обвязка поиска и следования для родителя | Дочерний NavigationAgent2D; физическое движение всё равно задаёте вы. |
Не выбирайте меш только потому, что он кажется «мощнее» сетки. Для пошагового поля клеточная модель может точнее выражать правила. Для свободного движения по поверхности не требуется вручную создавать точку графа в каждой возможной позиции.
Рабочий порядок для движения по поверхности
- Подготовьте
NavigationPolygonс реальными полигонами и назначьте егоNavigationRegion2D. Для программного примера используйте запекание квадрата. - Убедитесь, что регион и персонаж используют одну карту. Для отдельной карты назначьте её агенту явно; карты и владение.
- Создайте
CharacterBody2DиCollisionShape2D. Коллайдер нужен для физики, ресурс навигации — для поиска пути. - Добавьте дочерний
NavigationAgent2D. Для готового выполненного скрипта, точного имени дочерней Entity и формы используйте пример движения агента. - После публикации навигации вызовите
SetDestinationиз этого примера с глобальной целью. - Проверьте перемещение, достижение цели и остановку. Затем поставьте цель вне поверхности и отдельно обработайте частичный маршрут.
В проверенной карте x=0–20, y=0–10 физическое тело прошло от (2, 5) до (18, 5). Цель (30, 5) оказалась недостижимой, хотя агент закончил доступный маршрут. Это разные исходы, а не одна проверка IsNavigationFinished().
Какие объекты действительно нужны
NavigationPolygon хранит данные поверхности. NavigationRegion2D размещает их на карте. Карта объединяет регионы для запроса. NavigationAgent2D помогает выбрать очередную точку и при необходимости рассчитать избегание. CharacterBody2D выполняет физическое движение своим кодом.
NavigationLink2D обозначает специальный переход, но не исполняет прыжок или телепорт. NavigationObstacle2D участвует в избегании и/или разборе запекания; добавление препятствия не обновляет готовый путь автоматически. Не добавляйте эти Entity, пока задача их не требует.
Если персонаж не идёт
- Нет пути: проверьте полигоны, карту, слои и готовность навигации.
- Путь есть, тело стоит: нужен код движения родителя; сам агент его не двигает.
- Тело упёрлось в стену: согласуйте навигацию и коллизию. Проверенный физический коллайдер остановил тело даже при прямом маршруте через стену.
- Слишком медленно: для
MoveAndSlide()скорость задаётся в единицах в секунду, без второго умножения наdelta.
Маршрут следующего шага: агенты, регионы, затем доступ к участкам.
Выполнены сценарии физического движения, остановки, частичного пути и стены из связанного примера 2D. Выбор классов AStar сверен с SDK и исходниками; их алгоритмы, редакторская сборка уровня и графический результат этой проверкой не оценивались.