← Назад к вопросам

Что такое NavMesh в Unity и как он используется для поиска пути?

1.8 Middle🔥 132 комментариев
#Unity Core

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое NavMesh в Unity

NavMesh (Navigation Mesh, Навигационная сетка) — это система искусственного интеллекта в Unity, предназначенная для навигации агентов (персонажей, NPC, мобов) по сложной геометрии сцены с препятствиями. Это не просто сетка в математическом смысле, а специально сгенерированная полигональная карта проходимых областей, построенная на основе статической геометрии уровня.

NavMesh представляет собой упрощённое представление игрового мира, где каждая полигональная грань (треугольник) обозначает область, по которой агент может перемещаться. Система автоматически учитывает уклон поверхностей, высоту препятствий и другие параметры, заданные разработчиком.

Как генерируется и используется NavMesh

1. Генерация (Baking)

Процесс создания NavMesh называется "выпечкой" (baking). В редакторе Unity:

  • Открываем окно Window > AI > Navigation
  • На вкладке Object выбираем статические объекты (стены, пол, платформы), которые должны участвовать в навигации
  • Задаём параметры: Walkable, Not Walkable, Jump, Drop и т.д.
  • На вкладке Bake настраиваем параметры генерации:
    • Agent Radius — размер агента
    • Agent Height — высота агента
    • Max Slope — максимальный уклон
    • Step Height — максимальная высота ступеньки
  • Нажимаем кнопку Bake
// Пример автоматической генерации NavMesh во время выполнения (редко используется)
// Обычно используется предрассчитанный NavMesh
using UnityEngine;
using UnityEngine.AI;

public class NavMeshGenerator : MonoBehaviour
{
    void Start()
    {
        NavMeshSurface surface = GetComponent<NavMeshSurface>();
        surface.BuildNavMesh(); // Динамическая сборка NavMesh
    }
}

2. Поиск пути (Pathfinding)

Основной алгоритм поиска пути в NavMeshA* (A-star, "А-звёздочка")**, адаптированный для работы с полигональными сетками. Процесс включает:

  • Построение графа навигации — преобразование полигональной сетки в граф, где узлы — центры полигонов, а рёбра — соседние связи
  • Эвристический поиск — алгоритм находит оптимальный путь, минимизируя стоимость перемещения
  • Сглаживание пути — преобразование дискретного пути в плавную траекторию

3. Использование в коде

Основной компонент для работы с навигацией — NavMeshAgent. Пример реализации:

using UnityEngine;
using UnityEngine.AI;

public class EnemyAI : MonoBehaviour
{
    private Transform player;
    private NavMeshAgent agent;
    private Animator animator;
    
    void Start()
    {
        // Получаем ссылки на компоненты
        player = GameObject.FindGameObjectWithTag("Player").transform;
        agent = GetComponent<NavMeshAgent>();
        animator = GetComponent<Animator>();
        
        // Настройка параметров агента
        agent.speed = 3.5f;
        agent.angularSpeed = 360f;
        agent.acceleration = 8f;
        agent.stoppingDistance = 2f; // Дистанция остановки от цели
    }
    
    void Update()
    {
        // Постоянное обновление пути к игроку
        if (player != null && agent.isActiveAndEnabled)
        {
            agent.SetDestination(player.position);
            
            // Контроль анимации
            if (animator != null)
            {
                float speed = agent.velocity.magnitude / agent.speed;
                animator.SetFloat("Speed", speed);
            }
        }
    }
    
    // Метод для задания случайной точки на NavMesh
    public void SetRandomDestination(float radius)
    {
        Vector3 randomDirection = Random.insideUnitSphere * radius;
        randomDirection += transform.position;
        
        NavMeshHit hit;
        if (NavMesh.SamplePosition(randomDirection, out hit, radius, 1))
        {
            agent.SetDestination(hit.position);
        }
    }
}

4. Расширенные возможности системы

Локальное избегание препятствий

NavMeshAgent автоматически реализует Avoidance — алгоритм предотвращения столкновений между агентами в реальном времени. Это позволяет толпам NPC естественно расходиться.

// Настройка избегания столкновений
agent.obstacleAvoidanceType = ObstacleAvoidanceType.HighQualityObstacleAvoidance;
agent.avoidancePriority = 50; // Приоритет (0-99, меньше = выше приоритет)

Off-Mesh Links

Для обработки переходов, которые невозможно представить полигональной сеткой (прыжки через пропасти, канаты, лестницы):

// Создание Off-Mesh Link программно
OffMeshLink link = gameObject.AddComponent<OffMeshLink>();
link.startTransform = startPoint.transform;
link.endTransform = endPoint.transform;
link.biDirectional = true; // Двусторонний переход
link.activated = true;

Динамические препятствия

Для объектов, которые могут двигаться или меняться во время игры:

// Добавление динамического препятствия
NavMeshObstacle obstacle = gameObject.AddComponent<NavMeshObstacle>();
obstacle.carving = true; // "Вырезает" область из NavMesh в реальном времени
obstacle.shape = NavMeshObstacleShape.Capsule;
obstacle.size = new Vector3(2f, 3f, 2f);

Практические аспекты использования

Оптимизация навигации больших сцен

  1. Разделение на зоны — генерация отдельных NavMesh для разных областей уровня
  2. Иерархическая навигация — использование крупноблочного упрощённого графа для дальних маршрутов
  3. Асинхронные вычисления — поиск пути в отдельных потоках для предотвращения фризов

Типичные проблемы и решения

  • "Застревание" в углах — корректировка радиуса агента и использование agent.radius
  • Рывки при движении — настройка agent.acceleration и agent.angularSpeed
  • Неоптимальные пути — увеличение точности генерации (voxel size в настройках bake)

Работа с агентами разных размеров

Unity позволяет создавать несколько NavMesh'ей с разными параметрами агентов для персонажей разного размера через систему NavMesh Layers.

Заключение

NavMesh в Unity — это высокоуровневая, оптимизированная система навигации, которая абстрагирует сложные алгоритмы поиска пути. Её ключевые преимущества:

  • Автоматическая генерация на основе геометрии сцены
  • Интеграция с физикой и анимацией
  • Динамическое обновление при изменении окружения
  • Готовые решения для типовых игровых ситуаций

При правильной настройке NavMesh обеспечивает реалистичное и производительное перемещение AI-персонажей даже в сложных трёхмерных сценах, что критически важно для игрового immersiveness.

Что такое NavMesh в Unity и как он используется для поиска пути? | PrepBro