Как заставить NPC преследовать игрока в Unity с помощью NavMesh

В этом уроке мы будем использовать систему Unity NavMesh для создания NPC, преследующего игрока. NavMesh обеспечивает эффективный поиск пути и обход препятствий, что делает ее идеальной для поведения ИИ в 3D-средах.

Шаг 1: Подготовка сцены

Перед реализацией NavMesh нам нужна правильная настройка сцены:

  1. Создайте новый 3D-проект в Unity.
  2. Добавьте Plane, который будет служить землей.
  3. Добавьте Cube или любую 3D-модель для представления Игрока. Назовите ее Player.
  4. Добавьте еще один Cube или 3D-модель для представления NPC. Назовите его NPC.
  5. Разместите игрока и NPC в разных местах на плоскости.

Шаг 2: Запекание NavMesh

Чтобы использовать систему NavMesh Unity, нам необходимо запечь навигационную сетку:

  1. Выберите плоскость земли в иерархии.
  2. В инспекторе нажмите Добавить компонент и добавьте NavMeshSurface.
  3. В компоненте NavMeshSurface убедитесь, что плоскость отмечена как поверхность, по которой можно ходить.
  4. Нажмите кнопку Bake в компоненте NavMeshSurface, чтобы сгенерировать NavMesh.
  5. Необязательно: если у вас есть препятствия (например, стены), убедитесь, что они имеют компоненты NavMeshObstacle, чтобы блокировать движение NPC.

Шаг 3: Добавление NavMeshAgent

Теперь подготовим NPC к использованию поиска пути Unity:

  1. Выберите NPC в иерархии.
  2. В инспекторе нажмите Добавить компонент и добавьте NavMeshAgent.
  3. При необходимости настройте свойства NavMeshAgent, такие как скорость, ускорение и тормозной путь.

Шаг 4: Написание сценария погони

Далее мы создадим скрипт, который заставит NPC преследовать Игрока:

  1. Щелкните правой кнопкой мыши на панели Project и выберите Create > C# Script. Назовите его NPCChase.
  2. Дважды щелкните скрипт, чтобы открыть его в редакторе кода.
  3. Замените код по умолчанию следующим:
using UnityEngine;
using UnityEngine.AI;

public class NPCChase : MonoBehaviour
{
    public Transform player; // Reference to the player's position
    private NavMeshAgent agent; // Reference to the NavMeshAgent

    void Start()
    {
        // Get the NavMeshAgent component
        agent = GetComponent<NavMeshAgent>();
    }

    void Update()
    {
        if (player != null)
        {
            // Set the agent's destination to the player's position
            agent.SetDestination(player.position);
        }
    }
}

Шаг 5: Назначение сценария и ссылки на проигрыватель

Наконец, мы назначим скрипт и настроим ссылку на проигрыватель:

  1. Выберите NPC в иерархии.
  2. Перетащите скрипт NPCChase на NPC.
  3. В Инспекторе найдите поле Player в скрипте.
  4. Перетащите игровой объект Player из иерархии в поле Player.

Шаг 6: Тестирование сцены

Чтобы проверить вашу настройку:

  1. Нажмите кнопку Воспроизвести в редакторе Unity.
  2. Перемещайте игрока (например, с помощью клавиатуры или контроллера).
  3. Наблюдайте, как NPC динамично ищет путь и преследует игрока, избегая препятствий, где это возможно.

Необязательно: настройка поведения

Вы можете дополнительно улучшить поведение вашего NPC:

  • Расстояние остановки: Отрегулируйте Расстояние остановки NavMeshAgent, чтобы NPC остановился на определенном расстоянии.
  • Обход препятствий: Убедитесь, что препятствия имеют компоненты NavMeshObstacle для точного обхода.
  • Анимации: Используйте анимацию, чтобы сделать движения NPC более реалистичными, запуская анимацию в зависимости от скорости.

Заключение

Мы создали NPC, который динамически преследует игрока с помощью системы NavMesh Unity. Этот подход надежен и может быть легко расширен для более сложного поведения ИИ. Экспериментируйте с различными настройками, чтобы адаптировать поиск пути NPC к потребностям вашей игры.