Простейший AI: Поиск пути

В этой статье мы разберем простой способ, с помощью которого можно достаточно быстро научить игровые объекты искать путь, то есть перемещаться к цели минуя препятствия. Для этого тебе потребуется скачать проект с нужными компонентами — NavMesh.

Тебе необходима версия Unity 2017.2.0f1 или выше! Если с этим трудности, то сборки для других версий можно ⬇ скачать тут.

Подготовка

Для начала открой скачанный проект, создай новую сцену и собери в ней простой прототип из примитивных объектов.

Например такой
Например такой 🙂
p>Также тебе понадобится два игровых объекта: Target (цель, к которой будет стремиться наш монстр) и Creep (монстр, который будет искать путь до цели и двигаться к ней).

Мы сделали их из кубиков
Мы сделали их из кубиков

Для настройки NavMesh нам понадобится окно Навигация (англ. Navigation), открыть его можно так: Window → Navigation. Открывшееся окно будет справа (там где обычно находиться окно Инспектор). В нем тебе понадобиться вкладка Agents:

Окно Навигация Agents
Окно Навигация → Agents
Агенты (англ.Agents) — это типы объектов, которые должны как-то перемещаться по сцене и искать путь. Их может быть несколько. Согласись, что огромный огр и человек должны перемещаться немного по разному.

Есть несколько стандартных агентов, ты можешь их удалить или добавить свои. Каждый агент имеет:

  • Name — имя, так мы будем различать объекты на сцене: какие из них должны двигаться как огр, а какие как человек.
  • Radius и Height — радиус и высота, то есть габариты агента.
  • Step Height — высота шага агента.
  • Max Slope — максимальный угол подъема, например, на холм.

На картинке схематично показаны все эти параметры.

Теперь добавь объекту Creep компонент Nav Mesh Agent.

Компонент Nav Mesh Agent
Компонент Nav Mesh Agent

Вот какие настройки тебе понадобятся:

  • Agent Type — здесь можно выбрать тип агента: огр или человек? 🙂
  • Speed — скорость.
  • Angular Speed — скорость разворота.
  • Acceleration — ускорение.
  • Stop Distance — расстояние до цели, когда Creep должен остановиться.

Напишем простейший скрипт для Creep:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI; // подключаем к скрипту AI

public class Move : MonoBehaviour {

    [SerializeField]
    NavMeshAgent agent; // подключаем к нашему скрипту NavMeshAgent

    [SerializeField]
    Transform target; // здесь мы будем указывать цель

    void Start () {
        agent = GetComponent(); // команда автоматически ищет компонент NavMeshAgent у нашего объекта
        agent.SetDestination(target.position); // команда для нашего объекта, которая заставляет его перемещаться
	}

}

Последнее, что нужно сделать — разметить уровень. Чтобы было удобнее, создай пустой объект и сделай его родительским для всех объектов, по которым можно будет перемещаться.

Иерархия уровня
Иерархия уровня

Теперь добавь этому пустому объекту компонент Nav Mesh Surface. Выбери тип агента (Agent Type), который ты используешь, в параметре Collect Objects выбери Children, чтобы разметить только дочерние объекты, а в параметре Use Geometry выбери Physics Collider, чтобы использовать коллайдеры. Теперь жми кнопку Bake.

Готовая разметка
Готовая разметка

Готово👍 Теперь ты умеешь делать простой AI. Поздравляем✨

NavMesh в действии!
NavMesh в действии!