Как реализовать систему обхода препятствий в 2.5D игре на Unity?

Я разрабатываю 2.5D игру на платформе Unity, где земля реализована с использованием Rectangular Tilemap и расположена на одном уровне по оси Z. В игре есть три уровня высоты, которые отмечены на рисунке, и реализованные с помощью OrderInLayer и коллайдеров. Каждый уровень включает зоны с коллайдерами (предотвращающими переход с нижнего уровня на верхний) и без коллайдеров (например, чтобы игрок мог пройти за скалами). Переход между уровнями осуществляется по лестнице (обозначенной L на рисунке), которая также содержит коллайдер для изменения OrderInLayer и слоя сущности. В LayerCollisionMatrix настроено взаимодействие так, что сущность не взаимодействует с коллайдерами на своем уровне, но может взаимодействовать с коллайдерами на других уровнях.

Я хочу внедрить врагов, которые будут следовать за игроком и избегать препятствий. Как лучше всего это реализовать? Стоит ли использовать NavMesh, разрабатывать собственный алгоритм или применять сторонние библиотеки? 

Я уже попробовал встроенный NavMesh с дополнением NavMeshPlus, создав по три объекта с NavMeshSurface на каждом уровне и запек их с настроенными слоями. Однако возникла проблема: NavMeshSurfaces пересекаются у лестницы, из-за чего враг застревает. Встроенный NavMeshLink не подошел из-за отсутствия возможности задать его ширину, поэтому я решил написать собственный NavMeshLink, но это не решило проблему, и враг по-прежнему застревает в стене вместо того, чтобы избежать ее и пройти по лестнице.

Также я попробовал использовать A* Pathfinding Project, создав три Grid Graph и настроив их по слоям. Однако враг не перемещался между графами. Встроенные Link и Link2 не помогли.
  • 10 октября 2024 г. 9:04
Ответы на вопрос 2
Ваша задача состоит в том, чтобы реализовать систему навигации для врагов в 2.5D среде, учитывающей взаимодействия между различными уровнями высоты и препятствиями. Рассмотрим несколько подходов, которые могут помочь в вашей ситуации.

### 1. **Использование NavMesh с корректировкой**:
Проблема с пересечением NavMesh Surfaces у лестниц может быть решена следующими методами:

- **Создание отдельных NavMesh Surfaces для лестниц**: Вместо того чтобы иметь один большой NavMesh, создайте отдельные NavMesh Surfaces для лестниц. Это позволит более точно управлять поведением врагов при переходе между уровнями.
- **NavMesh Links**: Если стандартные NavMesh Link не подходят, можно написать свой собственный скрипт, который будет управлять сменой NavMesh, когда враг достигает лестницы. Например, вы можете использовать триггеры для изменения состояния NavMesh.
- **Использование NavMeshObstacle**: Для препятствий, которые могут двигаться (например, враги), можно использовать NavMesh Obstacle так, чтобы они не блокировали путь, когда враг проходит мимо.

### 2. **Собственный алгоритм навигации**:
Если NavMesh не справляется с задачей, можно рассмотреть написание собственного алгоритма:

- **Сетка для навигации**: Создайте простую сетку, которая будет представлять доступные для перемещения области. При этом можно учитывать уровень высоты, добавляя возможность "подниматься" и "опускаться" по лестницам.
- **Алгоритм A* или Dijkstra**: Реализуйте алгоритм поиска пути на этой сетке, чтобы враги могли находить путь к игроку, обходя препятствия.
- **Избегание столкновений**: Добавьте простую логику для избегания столкновений, например, Raycasting, чтобы проверять, есть ли препятствия перед врагом, и соответственно изменять направление его движения.

### 3. **Использование сторонних библиотек**:
Если вы хотите использовать сторонние решения, в том числе A* Pathfinding Project, убедитесь в следующем:

- **Ссылки между графами**: Убедитесь, что вы корректно настроили связи между графами. Убедитесь, что у вас есть соответствующие `Links` или `Links2`, которые позволят врагам перемещаться между разными уровнями графа.
  
- **Правильная настройка Grid Graph**: Убедитесь, что все три Grid Graph настроены на использование однотипных переменных, которые позволят избежать проблем с перемещением между ними. Возможно, потребуется написать ручной скрипт, который будет обрабатывать переходы между уровнями.

### 4. **Сочетание подходов**:
Можно комбинировать оба подхода: использовать NavMesh для более сложных маршрутов и реализовать собственную логику для обхода препятствий, особенно для взаимодействия с лестницами или другими уровнями. Ваша эскадра могла бы использовать NavMesh для большинства маршрутов, но переключаться на вашу логику в случае столкновения или необходимости подняться/опуститься по лестнице.

### Заключение
Выбор подхода по большей части зависит от сложности игры и требуемых возможностей. Если вас не устраивает существующий функционал, иногда лучше написать логику с нуля, которая будет больше соответствовать вашему уникальному игровому дизайну.
как вариант просто один навмешь 

я вот не знаю как с мостом быть наверно вот там и будет нужен линк
Похожие вопросы